我对XPath中过滤器表达式的关联性感到困惑。 这是一个例子:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:my="my"
exclude-result-prefixes="xs"
version="2.0">
<xsl:function name="my:func" as="xs:string*">
<xsl:message select="'my func enter'"/>
<xsl:sequence select="('apple', 'orange')"/>
</xsl:function>
<xsl:template match="/">
<xsl:sequence select="my:func()[.!='apple']"/>
<!-- <xsl:sequence select="my:func()[false()]"/>-->
</xsl:template>
</xsl:stylesheet>
在此样式表中,结果树为:'orange',消息输出为:'my func enter'。没关系。
但如果我发表评论:
<xsl:sequence select="my:func()[.!='apple']"/>
并取消注释:
<!-- <xsl:sequence select="my:func()[false()]"/>-->
然后没有输出(包括结果树和消息输出)。
我现在对过滤器表达的相关性感到困惑。
右或左?
为什么my:func中没有消息输出?
答案 0 :(得分:2)
XPath 3.1规范在§2.3.4中说明
考虑具有操作数(子表达式)E的表达式Q.通常,E的值是序列。处于中间阶段 在评估序列时,它的一些项目将是已知的 其他人将是未知的。如果,在这样的中间阶段 评估,处理器能够确定只有两个 评估Q的可能结果,即值V或误差, 那么处理器可以在不进一步评估的情况下传递结果V. 操作数E中的项目。
对于表达式declare @v varchar(100) = 'abc/portfolio/*/strategy' -> abc/portfolio/%/strategy
declare @v varchar(100) = 'abc/portfolio/**/strategy' --> abc/portfolio/%
,其中E[P]
对于P
中的所有项目都知道false()
,在评估P
中的第一项之前就知道了{1}}表达式(作为一个整体)的唯一可能结果是空序列或错误;因此处理器可以在不评估E
中的任何项目的情况下传递空序列。