1

**在 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 的 map,它是否比我现在使用的更有效?

4

1 回答 1

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() 的主要原因不是性能,而是灵活性:例如,您使用 xsl:key 索引的内容必须是节点,并且它们必须是单个文档中的节点,但地图没有这样的限制。

于 2016-03-17T11:20:39.113 回答