xslt 2.0如何使用键值属性变量与xslt 3.0 map不同?哪一个会表现得更快?

zak*_*ter 1 xml xslt 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>
Run Code Online (Sandbox Code Playgroud)

用它来获得这样的价值

<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>
Run Code Online (Sandbox Code Playgroud)

现在说如果我使用xslt 3.0,需要对xslt 2.0进行多少更改,如果我使用xslt 2.0中的map,它是否比我现在使用的更有效?

Mic*_*Kay 5

一些观察.

(1)XSLT 2.0处理器可能会也可能不会优化您的键查找表达式,$map/entry[@key=$columnname]以根据$ columnname的值使用某种索引或哈希表.(例如,Saxon-HE将进行连续搜索,但Saxon-EE将使用索引).如果你想要更快的机会(假设有数百个条目要搜索),那么你最好使用xsl:keykey()函数而不是简单的过滤表达式.

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