2012-09-10 17 views
23

私はxsltの新機能であり、簡単で複雑なことがわかりました。 いくつかの概念を明確にしたいと思います。 先行兄弟とは何ですか、祖先は​​何ですか、Googleから検索した後、私は祖先の説明を見つけました。彼らのウェブサイトからのチャートは理解しやすくなります。コンセプト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 = product \ inventory \ totalprice preceding-sibling :: pop - 私はこの1つを理解していません どのように一緒に読むのですか?

感謝

答えて

61

先行兄弟::軸

先行兄弟::軸は、焦点要素に先行するすべての兄弟要素を含むナビゲーションの軸です。 「兄弟」とは、参照項目と同じ親を持つ別の要素を意味します。 "先行する"とは、参照ノードの前にあるノードを意味します。前の兄弟軸の順序は、ドキュメントの逆順です。このドキュメントを見てみましょう:

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

焦点ノードが梨の場合は、-兄弟の前のシーケンスが:: *

  1. リンゴ
  2. バナナ
...です

注:フルーツ、ナシ、レディーフィンガーバナナ、キウイは順不同です。

だから、次は真である:

  1. 先行兄弟:: * [1]リンゴ
  2. 先行の兄弟である:: * [2]バナナ
  3. 数(preceding-です兄弟:: *)は、[1]また、Apple
  4. 先行兄弟であるリンゴ:: 2
  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> 

この例を研究するために少し変更する必要がフォーカスが要素フォーカス項目にあるとします。 ::ポップ/祖先-兄弟の前に式を評価する::在庫/手順

-兄弟の前
  1. に従ってくださいtotalprice :: popが項目を集中するすべての先行ポップの要素を選択します。これは、1つのノードのシーケンスを評価します。左側のシーケンス(そのように起こる一つだけポップ要素)の各項目については
  2. 、一時的なフォーカスアイテムとしてこのアイテムを設定し、ある/演算子の右側の式を評価...

    ancestor::inventory 
    

    祖先インベントリノードである唯一のノードがあります。したがって、最初の/演算子は、1つの在庫ノードのシーケンスを評価します。

  3. ここで、2番目の/と右側のオペランド式の合計価格の影響を評価します。左手順の各項目(それが起こるようにただ1つの目録ノード)では、これを一時的なフォーカス項目として設定し、totalpriceを評価します。

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

    によって

理解車軸の説明のためにthis pageをご覧ください。

これは、前の兄弟のためのそのページの図のコピーです。そのノードでは、参照ノードはCharlieであり、先行兄弟::軸上のノードは緑色です。そのような唯一のノードです。 enter image description here

+0

非常にクリア!ありがとうございます。 – olo

+0

@Sean: 'parent :: *'が ''を与え、 'ancestor :: *'が ''、 ''、 ' '。あれは正しいですか?敬具、Peter(あなたの素敵な説明のために+1) – Peter

+0

はい、それは正しいです。 –

2

先行兄弟は、現在のノードレベルでそれに先行し、すべての要素の兄弟を取得します。先行する兄弟のうちの1つ以上をxpath式で指定しない限り。特定の先行兄弟をxpathで指定すると、常に角かっこで1から始まります。

Ancestorは、式に一致する最初の一致する祖先です。したがって、ノードツリーを元に戻って、現在指している場所に基づいて一致する式を探します。あなたが製品/目録/飲み物/ポップ/ポップ/ポップであった場合、先祖インベントリ/トータルプライスは単にプリストの出現を探し、それを指し示すポインタを返すだけで、まだポップを指しています。

+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

関連する問題