29

I am very new to xslt, and found it can be easy or complex. I want to make clear some concepts. What is preceding-sibling and what is ancestor, after searching from google, I found ancestor explanation. and the chart from their website makes easier to understand.

But I still don't understand preceding-sibling

<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>

so how do I read this preceding-sibling::pop/ancestor::inventory/totalprice

ancestor::inventory/totalprice = product\inventory\totalprice preceding-sibling::pop - I dont understand this one then how to read all together?

Many thanks

4

3 に答える 3

79

previous-sibling:: 軸

preceding-sibling::軸は、フォーカス要素に先行するすべての兄弟要素を含むナビゲーションの軸です。「兄弟」とは、参照アイテムと同じ親を持つ別の要素を意味します。「先行する」とは、参照ノードの前に発生するノードを意味します。軸の順序はpreceding-siblingドキュメントの逆順です。このドキュメントを見てください:

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

フォーカス ノードが pear の場合、シーケンスpreceding-sibling::*は ...

  1. りんご
  2. バナナ

注: フルーツ、ナシ、レディーフィンガー バナナ、キウイは順番に並んでいません。

したがって、次のことが当てはまります。

  • preceding-sibling::*[ 1]りんごです
  • preceding-sibling::*[ 2]バナナです
  • count( preceding-sibling::*)は 2
  • preceding-sibling::apple[ 1]りんごでもある
  • preceding-sibling::banana[ 1]バナナです
  • preceding-sibling::*[ 3]存在しないか空のシーケンスです

前の兄弟::ポップ/祖先::在庫/合計価格の例

この例を有効に学習するには、サンプル ドキュメントを少し変更する必要があります。

<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>

フォーカスが要素 focus-item にあるとしましょう。式を評価するには、preceding-sibling::pop/ancestor::inventory/totalprice次の手順に従います。

  1. preceding-sibling::pop先行するすべてのpop要素をフォーカス項目に選択します。これは、1 つのノードのシーケンスに評価されます。
  2. 左側のシーケンスの各アイテム (たった 1 つのpop要素がそうです) について、このアイテムを一時的なフォーカス アイテムとして設定し、/ 演算子の右側の式を評価します ...

    ancestor::inventory
    

    そのようなノードは 1 つしかなく、祖先インベントリ ノードです。したがって、最初の / 演算子は、1 つのインベントリ ノードのシーケンスに評価されます。

  3. 次に、2 番目の / とその右側のオペランド式の合計価格の効果を評価します。左側のシーケンスの各アイテム (在庫ノードが 1 つだけなので、これが発生します) について、これを一時的なフォーカス アイテムとして設定し、評価しtotalpriceます。

  4. totalpriceの略ですchild::totalprice。一時フォーカス ノードの子軸には合計価格要素が 1 つしかないため、最終結果は合計価格ノードである 1 つのノードのシーケンスになります。

図による理解

の図を次に示しpreceding-sibling::ます。その参照ノードは Charlie で、preceding-sibling::軸上のノードは緑色です。そのようなノードはこれだけです。

ここに画像の説明を入力

于 2012-09-10T08:31:08.400 に答える
5

ノードツリーをナビゲートするのに役立つ軸。したがって、問題によって、どの種類の軸が役立つかによって異なります。

次のスタイルシートは違いを示しています。

<?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>
于 2012-09-10T08:45:45.427 に答える
2

Preceding-sibling は、現在のノード レベルでそれより前にあるすべての要素の兄弟を取得します。xpath 式で先行する兄弟を 1 つ以上指定しない限り。xpath で特定の先行兄弟を指定すると、常に角括弧内の 1 で始まります。

Ancestor は、式に一致する最初に一致する祖先です。そのため、ノード ツリーに戻り、現在指している場所に基づいて一致する式を調べます。したがって、product/inventory/drink/pop または単に /pop の場合、祖先の inventory/totalprice は最初の発生を検索し、その一致するケースを指すポインタのみを返す必要があります。それ以外の場合は、何も指していません。 'll はまだ pop を指しています。

于 2012-09-10T08:18:29.210 に答える