2012-09-10 64 views
23

我對xslt很新,發現它可以很容易或複雜。 我想澄清一些概念。 什麼是前面的兄弟姐妹,什麼是祖先,從谷歌搜索後,我找到了祖先的解釋。並從他們的網站圖表更容易理解。概念XML XLST前兄弟姐妹和祖先

但我還是不明白,前同輩

<product> 
    <inventory> 
     <drink> 
      <lemonade> 
       <price>$2.50</price> 
       <amount>20</amount> 
      </lemonade> 
      <pop> 
       <price>$1.50</price> 
       <amount>10</amount> 
      </pop> 
     </drink> 
      <service> 
      <address /> 
      <phone /> 
      <delivery> City </delivery> 
      </service>  
     <snack> 
      <chips> 
       <price>$4.50</price> 
       <amount>60</amount> 
      </chips> 
     </snack> 
     <hotfood></hotfood> 
     <totalprice> $15</totleprice> 

    </inventory> 
</product> 

讓我怎麼看這個前同輩::流行/祖先::庫存/ totalprice

祖先::庫存/ totalprice =產品\庫存\ totalprice 之前,兄弟姐妹::彈出 - 我不明白這一個 然後如何閱讀所有在一起?

非常感謝

回答

61

的前同輩::軸

的前同輩::軸是導航的軸線,包括所有前述同級元素的聚焦元件。 「兄弟姐妹」是指與參考項目具有相同父親的不同元素。 「之前」是指在引用之前引用的節點。前兄弟軸的順序是反向文檔順序。看看這個文件:

<fruit> 
    <banana> 
    <lady-finger-banana/> 
    </banana> 
    <apple/> 
    <pear/> 
    <kiwi/> 
</fruit> 

如果焦點節點是梨,然後順序前同輩:: *是...

  1. 蘋果
  2. 香蕉

注:水果,梨,香蕉和獼猴桃不在序列中。

所以以下情況:

  1. 前同輩:: * [1]是蘋果
  2. 前同輩:: * [2]是香蕉
  3. 計數(preceding-兄弟:: *)爲2
  4. 前同輩::蘋果[1]也是蘋果
  5. 前同輩::香蕉[1]是香蕉
  6. 前同輩:: * [3]缺席或者emp TY序列

前同輩::流行/祖先::庫存/ totalprice例

我們必須改變你的樣本文件一點點地有效學習這個例子

<product> 
    <inventory> 
     <drink> 
      <lemonade> 
       <price>$2.50</price> 
       <amount>20</amount> 
      </lemonade> 
      <pop> 
       <price>$1.50</price> 
       <amount>10</amount> 
      </pop> 
      <focus-item /> 
     </drink> 
     <totalprice>$15</totalprice> 
    </inventory> 
</product> 

我們說重點在於元素焦點項目。 爲了評價表達前同輩::流行/祖先::庫存/ totalprice按照下列步驟

  1. 前同輩::彈出選擇所有前述流行元素集中項目。這將評估爲一個節點的序列。
  2. 對於左手序列(它恰巧僅一個彈出元件),設置此項目作爲臨時焦點項目的每個項目,評價的/操作者這是右邊的表達式...

    ancestor::inventory 
    

    只有一個這樣的節點,它是祖先的庫存節點。因此,第一個/運營商評估爲一個庫存節點的序列。

  3. 現在我們評估第二個及其右手操作數表達式總價格的影響。對於左側序列中的每個項目(只有一個庫存節點發生),將其設置爲臨時焦點項目並評估總價格。

  4. totalprice是兒童:: totalprice的縮寫。臨時焦點節點的子軸上只有一個總價格元素,因此最終結果是一個節點序列,即總價格節點。

瞭解通過圖表

請看this page的軸系的說明。

下面是該頁面的前級兄弟姐妹::的副本。其中參考節點是Charlie,並且前同步::軸上的節點處於綠色。它是唯一的這樣的節點。 enter image description here

+0

很清楚!非常感謝 – olo

+0

@Sean:如果我關注元素焦點項目:'parent :: *'會給我'','祖先:: *'會給我'',''和' '。那是對的嗎?最好的問候,彼得(+1你的很好的解釋) – Peter

+0

是的,這是正確的。 –

2

前同輩得到它之前在當前節點級別的所有元素的兄弟姐妹。除非用xpath表達式指定一個或多個前面的兄弟姐妹。如果使用xpath指定特定的前同胞,則始終以方括號中的1開頭。

祖先是匹配表達式的第一個匹配的祖先。因此,它會返回節點樹,根據您當前指向的位置查看匹配的表達式。所以,如果你在產品/庫存/飲料/流行或只是/流行,那麼祖先庫存/總價只是尋找第一次出現,它應該只返回一個指向該匹配案例的指針,否則它將指向什麼也沒有,你我仍然會指着流行音樂。

+0

非常感謝您的回覆。請問我能再多舉幾個例子嗎? – olo

3

通過節點樹進行導航的軸。所以這取決於你的問題什麼樣的軸是有用的。

以下樣式表說明了區別。

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="snack"> 
     <xsl:variable name="siblings" select="ancestor::node()"/> 
     <debug> 
     <xsl:for-each select="preceding-sibling::node()"> 
       <sibling> 
         <xsl:value-of select="local-name()"/> 
       </sibling> 
     </xsl:for-each> 
     <xsl:for-each select="ancestor::node()"> 
       <ancestor> 
         <xsl:value-of select="local-name()"/> 
       </ancestor> 
     </xsl:for-each> 

     </debug> 
    </xsl:template> 

    <xsl:template match="*"> 
     <xsl:apply-templates select="*"/> 
    </xsl:template> 
</xsl:stylesheet> 
+0

很好的示例+1 – Peter