2015-03-30 121 views
2

我覺得,這是一個基本的XSLT問題。根據我的理解,節點集本身就是數據結構。從節點集()我無法導航到集外的任何節點。即我無法到達父母,也就是xml的開始或其兄弟姐妹。這是正確的嗎?節點集()是否有一個祖先節點?

有沒有辦法得到一個節點集()

代碼

<neighbourhood> 
<parent name = "xyz"> 
<child address=10> a </child> 
<child address=10> b </child> 
<child address=15> c </child> 
</parent> 
</neighbourhood> 

我有一組子節點的父。我需要消除重複「地址」的節點。 可以有n個「父」和m個「小孩」,並且可以有一個「孩子」的祖父節點。

最好的和合乎邏輯的方式可能是由每個家長去處理他們的孩子。但是,這是一個現有的代碼庫,這是一個簡單的例子。我不想通過觸摸調用者函數和其他模板來打破太多的事情。

所以,我的問題是,如果我可以用一組「孩子」獲得「父」節點我有

感謝您的答覆

+1

快速問題 - 爲什麼你需要?我從來不需要這樣做,我想知道是否有更好的方法來做你正在做的事情。 – Flynn1179 2015-03-31 08:57:15

+0

是的!我也這麼認爲。我只是不確定什麼是正確的方法可能。我已經用更多的細節更新了這個問題。我找到了一種解決方法來解決我的問題,但這可能不是最好的方法。 – user3208131 2015-03-31 15:37:11

+0

恐怕你的問題不再那麼清楚了。如果您的目標是消除重複,那麼 - 假設這是關於XSLT 1.0的 - 爲此使用[Muenchian分組](http://www.jenitennison.com/xslt/grouping/muenchian.html),或者 - 如果您的處理器支持它 - EXSLT'set:distinct()'函數。無論如何,在這種背景下什麼是「節點集」並不清楚,這樣的集合的祖先將在這方面扮演什麼角色。 – 2015-03-31 15:59:08

回答

3

是否節點集()有祖先節點?

node-set()是(擴展)功能 - 不是節點。一個函數不能擁有祖先,因爲它不是一個節點。

我想通過"node-set()"在問題中,您的意思是由xxx:node-set()函數返回的值(其中前綴「xxx」綁定到供應商特定的命名空間)。如果是這樣,在這裏是有用的答案:

根據定義,xxx:node-set()函數返回document-node()(也稱爲root-node XPath 1.0中)的臨時樹,這是通過轉換RTF獲得的(結果樹片段) ,作爲這個函數的唯一參數傳遞。

按照定義,文檔節點位於文檔層次結構的頂部,並且是XML文檔中沒有父節點的唯一節點。

因此,被調用xxx:node-set()函數返回的節點沒有任何祖先

從節點集()我無法導航到集外的任何節點。即我無法到達父母,也就是xml的開始或其兄弟姐妹。這是正確的嗎?

是的,而不調用從另一文檔返回一個節點(諸如標準XPath函數id()或標準XSLT功能document()),或引用變量/參數的另一個功能,是不可能導航到一個僅通過使用XPath位置步驟從另一個文檔創建節點。

有沒有辦法得到一個節點集()

號,由xxx:node-set()函數返回的節點是文檔節點和文檔節點沒有按的父沒有父母(或任何其他祖先)節點。

+0

感謝您確認此 – user3208131 2015-03-31 15:30:04

+0

@ user3208131,不客氣。 – 2015-03-31 15:49:27

2

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

我應該更具體。我正在討論Dimitre猜測的node-set()函數,它可以在RTF節點上工作。但是,感謝您的解釋 – user3208131 2015-03-31 15:29:32

2

節點集是一組節點。節點集中的每個節點都有祖先。節點集本身不。如果$ NS是節點集,則可以執行$NS/ancestor::node():這將爲您提供節點集中所有節點的所有祖先,並消除重複項。

+0

「節點集本身不」謝謝,邁克爾,以確認這一點。 – user3208131 2015-03-31 15:27:16

相關問題