不要混淆節點集和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