我遇到了与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/>
)。
谢谢, 约什
答案 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(.)"/>