xslt 2.0 处理器是否优化仅选择序列中的第一项?
Do xslt 2.0 processors optimize selecting only the first item in a sequence?
例如,输入文档:
<root b="1" />
和样式表:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/*">
<xsl:variable name="vTest" select="(@a, @b, @c)[1]" />
<xsl:value-of select="$vTest" />
</xsl:template>
</xsl:stylesheet>
XSLT 处理器是否通过不评估序列 (@a, @b, @c)[1]
中的 @c
项来进行优化?
以这种方式定义 vTest
的理由是尝试以更短的方式模拟 xsl:choose
逻辑。
我想这可能很难回答,我对 Saxon XSLT 2.0 处理器版本 9.5+ 特别感兴趣。
撒克逊肯定会做这个优化。但规范中没有任何内容可以保证这一点。并且在某些情况下可能不会发生,例如try/catch 中的执行策略可能略有不同。但通常是的,当您编写 EXPR[1].
时,大多数半途而废的 XSLT 处理器将避免完全评估 EXPR
例如,输入文档:
<root b="1" />
和样式表:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/*">
<xsl:variable name="vTest" select="(@a, @b, @c)[1]" />
<xsl:value-of select="$vTest" />
</xsl:template>
</xsl:stylesheet>
XSLT 处理器是否通过不评估序列 (@a, @b, @c)[1]
中的 @c
项来进行优化?
以这种方式定义 vTest
的理由是尝试以更短的方式模拟 xsl:choose
逻辑。
我想这可能很难回答,我对 Saxon XSLT 2.0 处理器版本 9.5+ 特别感兴趣。
撒克逊肯定会做这个优化。但规范中没有任何内容可以保证这一点。并且在某些情况下可能不会发生,例如try/catch 中的执行策略可能略有不同。但通常是的,当您编写 EXPR[1].
时,大多数半途而废的 XSLT 处理器将避免完全评估 EXPR