2009-07-15 46 views

回答

4

號當前上下文無法知道哪些節點是「下一個」或「上一個」。

這是因爲,例如,應用模板,機制是這樣的:

  1. 你這樣做:<xsl:apply-templates select="*" /><!-- select 3 nodes (a,b,c) -->
  2. 的XSLT處理器進行處理方式(A,B節點列表, C)
  3. 對於每個這些節點,XSLT處理器選擇的,並執行一個匹配模板
  4. 當模板被調用時,current()節點被定義,並且position()被定義,但比所述模板具有沒有ķ其他現在執行流程。
  5. 執行順序是受處理器的喜好,只要結果是保證是相同的。您的(理論上)預測對於一個處理器可能是正確的,而對另一個則是錯誤的。對於像XSLT這樣的副作用免費編程語言,我認爲這樣的知識會是一件危險的事情(因爲人們會開始依賴執行順序)。

你可以使用following::siblingpreceding::sibling XPath軸,但是這是不同的東西從知道什麼節點接下來將處理

編輯

上述解釋試圖回答這個問題,因爲它一直問,但OP 意味着有所不同。這是關於僅分組/輸出唯一節點。

按業務方案的要求,這裏的如何使用XPath軸來實現分組的快速演示。

XML(該項目是預先排序):

<items> 
    <item type="a"></item> 
    <item type="a"></item> 
    <item type="a"></item> 
    <item type="a"></item> 
    <item type="b"></item> 
    <item type="e"></item> 
</items> 

XSLT

<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
> 

    <xsl:template match="/items"> 
    <!-- copy the root element --> 
    <xsl:copy> 
     <!-- select those items that differ from any of their predecessors --> 
     <xsl:apply-templates select=" 
     item[ 
      not(@type = preceding-sibling::item/@type) 
     ] 
     " /> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="item"> 
    <!-- copy the item to the output --> 
    <xsl:copy-of select="." /> 
    </xsl:template> 

</xsl:stylesheet> 

輸出:

<items> 
    <item type="a"></item> 
    <item type="b"></item> 
    <item type="e"></item> 
</items> 
+0

正如在,我正在處理一個大的排序列表。實施例 <項類型= 「一」> <項類型= 「一」> <項類型= 「一」> <項類型= 「一」> <項類型= 「b」 的> 我希望能夠判斷前一個項目是否是相同的類型,所以我可以制定一些CSS來「組合」它們。 – James 2009-07-15 16:03:13

1

假設你正在談論在文檔結構下一個和前一個節點,而不是當前的執行流(例如,for-each環),請參見preceding-siblingfollowing-sibling軸:XPath Axes on W3

要獲得相同名字的下一個節點:

following-sibling::*[name() = name(current())] 

根據上下文,您可能需要在第一部分使用name(.)

0

你可以追蹤以前和在後處理變量電流。 也就是說您可以將標籤(i-2),標籤(i-1)和標籤(i)中的標籤一起使用。

只是另一個想法。

問候。