这是一棵树:
<tree id="alphabet">
<root>
<node id="node1">
<leaf>A</leaf>
<leaf>B</leaf>
</node>
<node id="node2">
<leaf>C</leaf>
<leaf>D</leaf>
</node>
</root>
</tree>
这是一个XSLT样式表:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html"/>
<xsl:template match="/">
<xsl:value-of select="//leaf"/>
</xsl:template>
</xsl:stylesheet>
所有XPath材质都说双斜杠(// leaf)表达式应该选择整个文档中的所有叶元素。 但是,在这种情况下,只有第一个叶子(A)被复制到输出,而不是它的兄弟。 相反,我们应用以下模板:
<xsl:template match="leaf">
<xsl:value-of select="."/>
<br/>
</xsl:template>
正如预期的那样,将所有4个叶元素的内容复制到输出。 这是为什么?
答案 0 :(得分:2)
您正在使用XSLT / XPath 1.0样式表:
第一种情况下的value-of
将所有leaf
元素的节点集转换为字符串,此操作仅使用first node:
通过返回字符串值,将节点集转换为字符串 节点集中的节点,该节点是文档顺序中的第一个节点。如果 node-set为空,返回空字符串。
在第二种情况下,您将value-of
应用于每个leaf
节点。
但是使用XSLT / XPath 2.0处理器(并在样式表上使用version='2.0'
),第一种情况下的value-of
将产生输出A B C D
。