.net AddExtensionObject-性能

.net AddExtensionObject-性能,.net,xslt,internationalization,.net,Xslt,Internationalization,.NET XSLT引擎允许通过AddExtensionObject方法将对象传递给XSLT处理引擎 有人能评论一下使用它检索XSLT中要使用的本地化字符串的性能吗?老实说,我不担心,这应该足够了。我使用一个扩展对象来做一些事情,比如正则表达式替换和其他复杂的字符串操作(在xslt中并不总是那么简单),它可以很好地工作 如果您只执行几个全局字符串,那么还可以使用模板级参数(而不是扩展);但是如果你有很多东西要查找(或者它们是动态的),那么扩展对象就很有意义了 如果可能,使用xslcomiledtr

.NET XSLT引擎允许通过AddExtensionObject方法将对象传递给XSLT处理引擎


有人能评论一下使用它检索XSLT中要使用的本地化字符串的性能吗?

老实说,我不担心,这应该足够了。我使用一个扩展对象来做一些事情,比如正则表达式替换和其他复杂的字符串操作(在xslt中并不总是那么简单),它可以很好地工作

如果您只执行几个全局字符串,那么还可以使用模板级参数(而不是扩展);但是如果你有很多东西要查找(或者它们是动态的),那么扩展对象就很有意义了

如果可能,使用
xslcomiledtransform
,这将提高性能(当然,扩展方法中的C#方法将比xslt中的
方法执行得更好)。除此之外,如果您遇到瓶颈,最有可能的情况是没有正确使用xsl索引、Muenchian分组等。如果XSLT转换的一部分被认为效率低下,则可以使用

来提高性能

虽然使用扩展方法不会降低性能(不包括有缺陷和低效的代码),但如果使用适当的XSLT技术访问本地化字符串,它们不会显著提高性能

如果不迫切需要扩展对象,那么最好创建一个纯XSLT解决方案。这提供了可移植到任何平台的附加好处,该平台提供了兼容的XSLT处理器

可以将给定语言的所有本地化字符串放在单独的XML文件中。将使用XSLT函数访问此文件。每个字符串都将使用指令生成的索引,通过其
@msgId
属性进行索引。在转换中,将使用XSLT函数获取单个消息

下面是一个小代码示例,展示了如何通过msgId和Language代码从xml文件中检索消息,所有语言的消息都存储在xml文件中。为了方便起见,我们将消息放在XSLT样式表本身中。实际上,消息可以位于单独的XML文件中:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>




早上好
下午好
晚上好

古滕·摩根。
古滕标签。
古滕·阿本德。


晨曦
阿芬格里特
埃文格里特


将此转换应用于任何源XML文档(忽略)时,将生成所需的结果:

Guten abend.

 <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>