2012-01-31 31 views
2

我經常看到它說,在XSLT 1.0中,節點集是無序的,而且節點集中的節點是按文檔順序處理的。這是什麼意思,一個節點集是無序的?

這聽起來像一個節點集按文檔順序排序。

如果「無序但按照文檔順序處理」和「按文檔順序排序」之間存在差異,那麼我何時必須擔心這種差異?

+1

它聽起來像它們存在的順序並不重要,但是在處理時,它們按照在文檔中找到的順序進行處理(因爲它們必須按* some *順序處理,即使具體順序並不重要)。 – FrustratedWithFormsDesigner 2012-01-31 16:56:51

+0

以下是不同之處:執行XPath選擇結果的聯合時,同一個節點不會出現多次。工會不是聯合。好的,除了聯盟之外,還有什麼地方可以將節點集作爲按文檔順序排序的序列嗎? – JPM 2012-02-01 02:31:29

+0

我仍然沒有看到節點列表之間的區別,默認爲文檔順序,除非排序,節點集合默認爲文檔順序,除非排序。 – JPM 2012-02-01 15:34:38

回答

0

一組和一個序列是非常不同的。

在一個序列中,同一個項目可能會出現多次。

按照定義,一組中的所有項目都是不同的 - 在一個集合中不能存在一對項目$it1$it2,使得identical(@it1, $it2)

讓我們有這個XML文檔:

<a> 
<b> 
    <a> 
    <c> 
     <a/> 
    </c> 
    </a> 
</b> 
</a> 

這個XPath表達式:

//a/ancestor-or-self::a 

這將選擇三個節點,但是如果評估的結果是一個序列,結果序列將包含六節點。

如果「無序,但在文件處理 秩序」之間的差值「下令文檔順序」,我什麼時候必須真正擔心 有關區別?

至少有兩件事情需要注意的:

  1. 節點集是不一樣的節點列表。節點列表的順序可能與其包含的節點的文檔順序不同 - 例如,當這些指令有xsl:sort孩子時,節點列表爲xsl:apply-templates和/或xsl:for-each。該節點列表通常與文檔順序的順序不同。

  2. 該文件訂單不是總訂購關係。例如,(相同元素的)兩個屬性節點的位置是實現定義的,並且可能因不同的XPath實現而有所不同。此外,每個屬於不同文檔的兩個節點之間的「文檔順序」未定義,並因不同的XPath/XSLT實現而異。

在XSLT 2.0/XPath 2.0中一個,如果他使用其中的節點集,預計在一個地方的節點序列可以得到一個非常意外和混亂的結果 - 序列中的節點將重複數據刪除和將不會按照它們的順序進行進一步處理,而是按文檔順序進行處理。