AddExtensionObject - 性能

Nis*_*ith 2 .net xslt internationalization

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

有人可以评论使用它来检索要在XSLT中使用的本地化字符串的性能吗?

Dim*_*hev 6

如果认为XSLT转换的一部分效率低下,则可以使用扩展对象来提高性能.

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

如果不迫切需要扩展对象,那么创建纯XSLT解决方案总是好的.这为任何平台提供了可移植性的额外好处,可提供兼容的XSLT处理器.

可以将给定语言的所有本地化字符串放在单独的XML文件中.将使用XSLT document()函数访问此文件.每个字符串将@msgId使用<xsl:key>指令构建的索引通过其属性编制索引.在转换中,将使用XSLT key()函数获取单个消息.

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

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>
Run Code Online (Sandbox Code Playgroud)
 <xsl:key name="kMsgByLangAndId" match="msg"
      use="concat(../@name, @msgId)"/> 
Run Code Online (Sandbox Code Playgroud)
 <xsl:param name="pLang" select="'De'"/>
 <xsl:param name="pTime" select="19"/>
Run Code Online (Sandbox Code Playgroud)
 <xsl:variable name="vMsgEn">
  <msg msgId="MornGreet">Good morning.</msg>
  <msg msgId="AftnGreet">Good afternoon.</msg>
  <msg msgId="EvnGreet">Good evening.</msg>
 </xsl:variable>
Run Code Online (Sandbox Code Playgroud)
 <xsl:variable name="vMsgDe">
  <msg msgId="MornGreet">Guten morgen.</msg>
  <msg msgId="AftnGreet">Guten tag.</msg>
  <msg msgId="EvnGreet">Guten abend.</msg>
 </xsl:variable>
Run Code Online (Sandbox Code Playgroud)
    <xsl:template match="/">
      <xsl:variable name="vLangVarName"
           select="concat('vMsg', $pLang)"/>
Run Code Online (Sandbox Code Playgroud)
    <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>
Run Code Online (Sandbox Code Playgroud)
   <xsl:for-each select="document('')">
    <xsl:value-of select=
      "key('kMsgByLangAndId',
            concat($vLangVarName,$vMsgId)
            )"/>
   </xsl:for-each>
Run Code Online (Sandbox Code Playgroud)
    </xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)

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

Guten abend.