具有键值属性的 xslt 2.0 变量与 xslt 3.0 映射有何不同?哪一个会执行得更快



>**在 XSLT 2.0 中 **我是这样使用它的:

声明变量

    <xsl:variable name="map">
        <entry parent="false" type="DateTime"  key="MKR_DT"          class="Base"             maprule="primarykey">lastUpdatedDate</entry>
        <entry parent="false" type="String"    key="POA_ADD_1"       class="AddressType"      maprule="primarykey-AddressType__Home Address">address1</entry>
<entry parent="false" type="String"    key="POA_ADD_2"       class="AddressType"      maprule="primarykey-AddressType__Home Address">address2</entry>
<entry parent="false" type="String"    key="POA_ADD_3"       class="AddressType"      maprule="primarykey-AddressType__Home Address">address3</entry>
<entry parent="false" type="String"    key="POA_ADD_4"       class="AddressType"      maprule="primarykey-AddressType__Home Address">address4</entry>
    </xsl:variable>

使用它来获得这样的价值

<xsl:for-each select="x:ROW_LCR/x:new_values/x:new_value">
 <xsl:variable name="columnname" select="x:column_name">
 <xsl:if test="$map/entry[@key=$columnname]>
  //some code here
 </xsl:if>
</xsl:for-each>
现在假设如果我使用 xslt 3.0,那么 xslt 2.0

需要多少更改,如果我使用 xslt 2.0 中的地图,它是否比我现在使用的更有效?

一些观察。

(1) XSLT 2.0 处理器可能会也可能不会优化您的密钥查找表达式,$map/entry[@key=$columnname]使用某种基于 $columnname 值的索引或哈希表。(例如,Saxon-HE 将执行串行搜索,但 Saxon-EE 将使用索引)。如果您希望快速获得更好的机会(假设要搜索数百个条目),那么最好使用 xsl:keykey() 函数,而不是简单的过滤器表达式。

(2) XSLT 3.0 中任何合理的映射实现都将使用某种索引或哈希机制来提供按键快速访问。它可能与xsl:key和key()函数使用的机制相同,并且可能具有相似的性能。优先使用 maps 而不是 xsl:key 和 key() 的主要原因不是性能,而是灵活性:例如,使用 xsl:key 索引的内容必须是节点,并且它们必须是单个文档中的节点,但 maps 没有这样的限制。

相关内容

最新更新