XPath中过滤器表达式的相关性

时间:2018-01-08 10:26:31

标签: xml xslt xpath

我对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中没有消息输出?

1 个答案:

答案 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中的任何项目的情况下传递空序列。