令人惊讶的XSLT / XPath表达式类型行为

时间:2015-07-14 00:27:42

标签: xml xslt xpath

我遇到了与XSLT / XPath中的类型相关的行为,我无法解释。这是一个显示问题的XSLT片段(当然,它不是一个非常有用的XSLT,但它代表了一个非常简单的演示我的问题):

    <?xml version="1.0"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
        <xsl:template match="/">
            <xsl:variable name="root">
                <xsl:sequence select="root(.)"/>
            </xsl:variable>
            <xsl:if test="root(.) is  $root">
                Match
            </xsl:if>
        </xsl:template>
    </xsl:stylesheet>

您会看到“匹配”显示。但是,如果您将as="node()"添加到<xsl:variable name="root">,则会显示“匹配”

任何人都可以解释一下帮助我理解为什么吗?

您可以将此XSLT插入http://xslttest.appspot.com以探索问题。任何输入XML都可以使用(例如,<?xml version="1.0"?><foo/>)。

谢谢, 约什

1 个答案:

答案 0 :(得分:2)

要知道序列和变量之间的区别,您可以浏览以下link

总而言之,xsl:variable没有as属性会创建一个新文档(拥有自己的根节点)。 使用as属性有助于创建原子值或序列。这里,变量不是根节点,而是指它包含的序列。

使用时:

<xsl:variable name="root">
            <xsl:sequence select="root(.)"/>
</xsl:variable>

使用条件<xsl:if test="root(.) is $root">,您将测试输入XML文档的根是否与变量root的根相同,即false

当你使用:

<xsl:variable name="root" as="node()">

条件root(.) is $root评估为true,因为输入文档根和变量root生成的序列都相同。

当然,正如michael.hor257k所提到的,这个样式表应该是版本2.0

修改 以下列方式声明变量也会使条件true()

<xsl:variable name="root" select="root(.)"/>