不要混淆节点集和node-set()
s。
这是什么意思?那么,一个节点集是一组节点。在正常的未扩展XSLT 1.0中,这意味着从输入文档中选择节点。如果我这样做:
<!-- a node set -->
<xsl:variable name="my-node-set"
select="/indoc/level1/level2"/>
变量$my-node-set
包含一组level2
节点,但这些节点仍然生活在输入文件内。如果我后来做了for-each
像这样:
<nodeset-from-indoc>
<xsl:for-each select="$my-node-set/level3">
<parent>
<xsl:value-of select="local-name(..)"/>
</parent>
<grandparent>
<xsl:value-of select="local-name(../..)"/>
</grandparent>
</xsl:for-each>
</nodeset-from-indoc>
我将得到家长和各节点的祖父母的名字:
<nodeset-from-indoc>
<parent>level2</parent><grandparent>level1</grandparent>
<parent>level2</parent><grandparent>level1</grandparent>
<parent>level2</parent><grandparent>level1</grandparent>
</nodeset-from-indoc>
但是,如果我硬编码的节点进入变量:
<!-- a result-tree fragment -->
<xsl:variable name="my-rtf">
<level2>
<level3>1</level3>
</level2>
<level2>
<level3>2</level3>
</level2>
<level2>
<level3>3</level3>
</level2>
</xsl:variable>
这是不节点集,但结果树片断,由于y没有从输入文件中选择。结果树片段的问题是你不能在它们上使用XPath。我不能,例如,做到这一点:
<xsl:for-each select="$my-rtf/level3">
这就是node-set()
功能显得尤其这是XSLT 1.0的扩展,它来源于一些扩展名称空间,这取决于你的XSLT处理器。许多处理器选择在由EXSLT定义的命名空间中实现这一点。
正如Dmitre指出的那样,node-set()函数返回一个临时树的魔术文档节点,允许您使用XPath。 但是,这导致了如何选择需要做一个微妙的转变。因为魔法文档节点,我必须包含在我的选择level2
:
<nodeset-from-rtf>
<xsl:for-each select="exsl:node-set($my-rtf)/level2/level3">
<parent>
<xsl:value-of select="local-name(..)"/>
</parent>
<grandparent>
<xsl:value-of select="local-name(../..)"/>
</grandparent>
</xsl:for-each>
</nodeset-from-rtf>
而且在这种情况下,level3
节点将有父母,但没有祖父母:
<nodeset-from-rtf>
<parent>level2</parent><grandparent/>
<parent>level2</parent><grandparent/>
<parent>level2</parent><grandparent/>
</nodeset-from-rtf>
快速问题 - 为什么你需要?我从来不需要这样做,我想知道是否有更好的方法来做你正在做的事情。 – Flynn1179 2015-03-31 08:57:15
是的!我也这么认为。我只是不确定什么是正确的方法可能。我已经用更多的细节更新了这个问题。我找到了一种解决方法来解决我的问题,但这可能不是最好的方法。 – user3208131 2015-03-31 15:37:11
恐怕你的问题不再那么清楚了。如果您的目标是消除重复,那么 - 假设这是关于XSLT 1.0的 - 为此使用[Muenchian分组](http://www.jenitennison.com/xslt/grouping/muenchian.html),或者 - 如果您的处理器支持它 - EXSLT'set:distinct()'函数。无论如何,在这种背景下什么是“节点集”并不清楚,这样的集合的祖先将在这方面扮演什么角色。 – 2015-03-31 15:59:08