1. ホーム
  2. xml

[解決済み] 概念 XML XLST 先行-兄弟-祖先

2022-02-18 20:52:54

質問

私はxsltの初心者ですが、簡単なものもあれば複雑なものもあることがわかりました。 私はいくつかの概念を明確にしたい。 Googleで検索したところ、ancestorの説明が見つかり、そのウェブサイトの図がわかりやすかったです。

でも、先住兄弟がまだよくわからない。

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

これをどう読むか 先行兄弟::pop/先祖::在庫/totalprice

ancestor::inventory/totalprice = productintinventorytotalprice preceding-sibling::pop - これはよくわからない。 では、どのように読み解けばよいのでしょうか。

ありがとうございました。

解決方法は?

先行兄弟::軸

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] が存在しないか、空のシーケンス

先行兄弟::pop/先祖::inventory/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>

ここでは、focus-itemという要素にフォーカスが当たっているとします。 を評価するために preceding-sibling::pop/ancestor::inventory/totalprice は、以下の手順で行います。

  1. preceding-sibling::pop は、直前のすべての pop 要素をfocus-itemにする。これは1つのノードのシーケンスとして評価される。
  2. 左側のシーケンスの各項目について(ちょうど1つの pop 要素で、この項目を一時的なフォーカス項目として設定し、 / 演算子の右側にある式を評価します。

    ancestor::inventory
    
    

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

  3. 次に、2 番目の / とその右側のオペランド式 total price の効果を評価します。左側のシーケンスにある各アイテム (インベントリノードは 1 つだけなので、そうなります) に対して、これを一時的なフォーカスアイテムとして設定し、次のように評価します。 totalprice .

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

図解で理解する

以下は preceding-sibling:: . この中で、参照ノードは Charlie であり、その上のノードは preceding-sibling:: 軸が緑色で表示されています。このようなノードはこれだけです。

<イグ