我在推送转换中使用<xsl:key>
,在模板模式中使用它,例如:
<xsl:template match="key('div', 'MAIN')">
...
</xsl:template>
...而不是:
<xsl:template match="html:div[upper-case(@id) = 'MAIN']">
...
</xsl:template>
但是,我不知道这是否有任何性能优势,最近我一直在想,因为这是一个推送转换,并且无论如何访问节点,关键真的很有用吗?
答案 0 :(得分:2)
虽然性能差异可以忽略不计,但在比较性能时:
<xsl:template match="key('div', 'MAIN')">
到:
<xsl:template match="html:div[upper-case(@id) = 'MAIN']">
在key()
函数选择大量节点的任何情况下,似乎后者 更有效。
<强>解释强>:
匹配key()
等同于匹配key()
函数返回的节点集中节点的并集。因此,XSLT处理器必须确定当前节点是否属于该节点集。这可能是一个相当低效的操作,特别是如果key()
函数选择的节点集很重要的话。
在第二种情况下,我们有一个简单的匹配。确定当前节点是否与匹配表达式匹配仅涉及一个节点测试和简单条件的验证。这通常比检查当前节点到大型节点集的成员资格要简单。
答案 1 :(得分:1)
我很少看到匹配模式中使用的key()。我认为不太可能给出任何显着的性能优势,除非密钥的“使用”条件非常复杂并且密钥经常用于分摊构建索引的成本。与性能问题一样,它取决于您使用的处理器,唯一真正的方法是测量它。