.NET的XSLT引擎允许通过AddExtensionObject方法将对象传递给XSLT处理引擎。
有人能否就使用此方法检索用于XSLT中的本地化字符串的性能发表评论?
.NET的XSLT引擎允许通过AddExtensionObject方法将对象传递给XSLT处理引擎。
有人能否就使用此方法检索用于XSLT中的本地化字符串的性能发表评论?
“扩展对象”可用于提高性能,如果XSLT转换的一部分被认为效率低下。
使用扩展方法的方法不会降低性能(不包括错误和低效的代码),如果使用适当的XSLT技术访问本地化字符串,它们不会显著提高性能。
如果没有急需扩展对象,最好创建纯XSLT解决方案。这提供了额外的好处,可以在任何平台上提供符合条件的XSLT处理器。
一个语言的所有本地化字符串可以放置在单独的XML文件中。此文件将使用XSLT的 document()
函数进行访问。每个字符串都将由其 @msgId
属性进行索引,使用由 <xsl:key>
指令构建的索引。在转换中,将使用XSLT的 key()
函数获取单个消息。
下面是一个小的代码示例,展示如何从一个包含所有语言的xml文件中通过msgId和语言代码检索消息。为了方便起见,我们已经把消息放在XSLT样式表中了。实际上,这些消息可以在一个单独的XML文件中。
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:key name="kMsgByLangAndId" match="msg"
use="concat(../@name, @msgId)"/>
<xsl:param name="pLang" select=" De "/>
<xsl:param name="pTime" select="19"/>
<xsl:variable name="vMsgEn">
<msg msgId="MornGreet">Good morning.</msg>
<msg msgId="AftnGreet">Good afternoon.</msg>
<msg msgId="EvnGreet">Good evening.</msg>
</xsl:variable>
<xsl:variable name="vMsgDe">
<msg msgId="MornGreet">Guten morgen.</msg>
<msg msgId="AftnGreet">Guten tag.</msg>
<msg msgId="EvnGreet">Guten abend.</msg>
</xsl:variable>
<xsl:template match="/">
<xsl:variable name="vLangVarName"
select="concat( vMsg , $pLang)"/>
<xsl:variable name="vMsgId">
<xsl:choose>
<xsl:when test="not($pTime >= 12)">MornGreet</xsl:when>
<xsl:when test="not($pTime >= 18)">AftnGreet</xsl:when>
<xsl:otherwise>EvnGreet</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:for-each select="document( )">
<xsl:value-of select=
"key( kMsgByLangAndId ,
concat($vLangVarName,$vMsgId)
)"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
当此转换应用于任何源XML文档(被忽略),会得到所需的结果:
晚上好。
老实说,我不会担心这个 - 它应该是足够的。我使用一个扩展对象来执行诸如正则表达式替换和其他复杂的字符串操作(在xslt中并不总是简单的),而它的效果很好。
如果您只需要处理几个全局字符串,则可以使用模板级参数(而不是扩展程序)。但是,如果您需要查找很多(或它们是动态的),那么扩展程序对象是比较明智的选择。
如果可能的话,使用 XslCompiledTransform
,它将提高性能(当然,扩展方法中的C#方法将比xslt中的&lt; script&gt; code>方法表现更好)。 除此之外,如果您遇到瓶颈,最有可能的原因是未正确使用xsl索引,Muenchian-grouping等。