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

How xslt 2.0 is variable with key value attribute is different from xslt 3.0 map? Which one will perform faster?

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

Declaring a variable

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

Using it to get value like this

<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 的值使用某种索引或散列 table。 (例如,Saxon-HE 将执行串行搜索,但 Saxon-EE 将使用索引)。如果你想要更快的机会(假设要搜索数百个条目)那么你最好使用 xsl:keykey() 函数而不是简单的过滤器表达式。

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