Concept XML XLST poprzedzający-rodzeństwo i przodek

Jestem bardzo nowy w xslt i stwierdziłem, że może to być łatwe lub złożone. Chcę wyjaśnić pewne pojęcia. Co jest poprzedzające-rodzeństwo i co jest przodkiem, po przeszukaniu z google znalazłem Wyjaśnienie przodka. a Wykres z ich strony internetowej ułatwia zrozumienie.

Ale nadal nie rozumiem poprzedzającego-rodzeństwo

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

Więc jak to odczytać previous-sibling:: pop/ancestor:: inventory/totalprice

Ancestor:: inventory / totalprice = produkt\inwentaryzacja\totalprice poprzedni-sibling:: pop-i dont understand this one więc jak czytać wszystko razem?

Wielkie dzięki

Author: Dimitre Novatchev, 2012-09-10

3 answers

The previous-sibling:: axis

Previous-sibling:: axis jest osią nawigacji, która obejmuje wszystkie poprzednie elementy rodzeństwa do elementu focus. Przez "rodzeństwo" rozumiemy inny element, który ma ten sam rodzic do elementu odniesienia. Przez "poprzedzający" rozumiemy węzeł, który ocurruje się przed referencyjnym. Kolejność osi poprzedzającej jest odwrotną kolejnością dokumentu. Spójrz na ten dokument:

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

Jeśli węzłem ostrości jest pear, to sekwencja previous-sibling::* is ...

  1. jabłko
  2. banan

Uwaga: Owoce, Gruszka, lady-finger-banan i kiwi nie są w kolejności.

Tak więc prawda jest następująca:

  1. previous-sibling:: * [1] is the apple
  2. previous-sibling::*[ 2] is the banan
  3. count (previous-sibling::*) is 2
  4. poprzedzający-sibling:: apple[ 1] jest również jabłkiem
  5. previous-sibling::banan[ 1] is the banan
  6. previous-sibling:: * [3] is nieobecny or the empty sequence

Previous-sibling::pop/ancestor:: inventory/totalprice Example

Musimy nieco zmienić przykładowy dokument, aby z powodzeniem przestudiować ten przykład

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

Powiedzmy, że skupiamy się na elemencie focus-item. Aby ocenić wyrażenie poprzedzające-sibling::pop/ancestor:: inventory/totalprice wykonaj następujące kroki

  1. previous-sibling::pop wybiera wszystkie poprzedzające Elementy pop do pozycji fokusowej. To ewaluuje do sekwencji jednego węzła.
  2. Dla każdego elementu w sekwencji lewej ręki (tylko jeden element pop tak się dzieje), Ustaw ten element jako tymczasowy element ostrości i oceń wyrażenie prawa operatora/, które jest ...

    ancestor::inventory
    

    Istnieje tylko jeden taki węzeł, który jest węzłem inwentarza przodków. W ten sposób pierwszy / operator ocenia sekwencję jednego węzła inwentaryzacyjnego.

  3. Teraz oceniamy efekt drugiego / i jego prawostronne wyrażenie operandu całkowita cena. Dla każdego elementu w sekwencji lewej ręki (tak się dzieje tylko jeden węzeł inwentaryzacji), ustaw go jako tymczasowy element ostrości i oceń totalprice.

  4. totalprice jest skrótem od child:: totalprice . Istnieje tylko jeden element ceny całkowitej na osi potomnej tymczasowego węzła ostrości, więc końcowy wynik jest sekwencją jednego węzła, który jest węzłem ceny całkowitej.

Zrozumienie przez diagramy

Proszę spojrzeć na to strona do ilustracji osi.

Oto Kopia diagramu tej strony dla previous-sibling:: . W nim węzłem odniesienia jest Charlie, a węzeł na osi poprzedzającej-sibling:: jest w kolorze zielonym. Jest to jedyny taki węzeł. Tutaj wpisz opis obrazka

 66
Author: Sean B. Durkin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-10 08:45:20

Osie przydatne do nawigacji po drzewie węzłów. Więc to zależy od Twojego problemu, jaki rodzaj osi jest przydatny.

Poniższy arkusz stylów ilustruje różnicę.

<?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>
 3
Author: OkieOth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-10 08:45:45

Preceding-sibling pobiera wszystkie rodzeństwo elementu, które go poprzedzało na bieżącym poziomie węzła. Chyba że za pomocą wyrażenia xpath określisz jedno lub więcej z poprzedzających rodzeństwa. Jeśli za pomocą xpath podasz konkretny poprzedzający-sibling, to zawsze zaczyna się od 1 w nawiasach kwadratowych.

Ancestor jest pierwszym pasującym przodkiem, który pasuje do wyrażenia. Więc wraca do drzewa węzłów, aby spojrzeć na pasujące wyrażenie na podstawie tego, gdzie aktualnie wskazujesz. Więc jeśli byłeś na product / inventory/drink / pop or just / pop then ancestor inventory / totalprice po prostu szuka wystąpienia frist i powinien zwrócić tylko wskaźnik wskazujący na ten pasujący przypadek, w przeciwnym razie będzie wskazywał na nic, a Ty nadal będziesz wskazywał na pop.

 2
Author: RetroCoder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-10 11:00:12