web-dev-qa-db-fra.com

Concept XML-frère et ancêtre précédent XSLT

Je suis très nouveau sur xslt et j'ai trouvé que cela pouvait être facile ou complexe. Je veux clarifier certains concepts. Ce qui précède-frère et ce qui est ancêtre, après avoir recherché sur google, j'ai trouvé l'explication de l'ancêtre. et le graphique de leur site Web est plus facile à comprendre.

Mais je ne comprends toujours pas mon frère précédent

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

alors comment lire ceci frère-précédent :: pop/ancêtre :: inventaire/prix total

ancêtre :: inventaire/prix total = produit\inventaire\prix total précédant-frère :: pop - Je ne comprends pas celui-ci alors comment lire tous ensemble?

Merci beaucoup

27
olo

Le précédent-frère :: axe

L'axe précédent-frère :: est un axe de navigation qui inclut tous les éléments frères précédents de l'élément focus. Par "frère", nous entendons un élément différent qui a le même parent que l'élément de référence. Par "précédant", nous entendons un nœud qui se produit avant celui de référence. L'ordre de l'axe frère-frère est l'ordre inverse du document. Jetez un œil à ce document:

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

Si le nœud de focus est poire, alors la séquence précédant-frère :: * est ...

  1. Apple
  2. banane

Remarque: les fruits, la poire, la banane-doigt et le kiwi ne sont pas dans la séquence.

Donc, ce qui suit est vrai:

  1. précédent-frère :: * [1] est l'Apple
  2. précédent-frère :: * [2] est la banane
  3. count (precedent-frère :: *) est 2
  4. précédent-frère :: Apple [1] est aussi Apple
  5. frère précédent :: banane [1] est la banane
  6. précédent-frère :: * [3] est absent ou la séquence vide

frère-précédent :: pop/ancêtre :: inventaire/prix total Exemple

Nous devons modifier un peu votre exemple de document pour étudier utilement cet exemple

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

Disons que l'accent est mis sur l'élément focus-item. Pour évaluer l'expression précédant-frère :: pop/ancêtre :: inventaire/prix total, procédez comme suit

  1. precedent-frère :: pop sélectionne tous les éléments pop précédents à focus-item. Cela correspond à une séquence d'un nœud.
  2. Pour chaque élément de la séquence de gauche (un seul élément pop, cela se produit), définissez cet élément comme un élément de focus temporaire et évaluez l'expression de la droite de l'opérateur/qui est ...

    ancestor::inventory
    

    Il n'y a qu'un seul nœud de ce type, qui est le nœud d'inventaire ancestral. Ainsi, le premier opérateur/évalue une séquence d'un nœud d'inventaire.

  3. Maintenant, nous évaluons l'effet du second/et son prix total d'expression de l'opérande de droite. Pour chaque article dans la séquence de gauche (un seul noeud d'inventaire pour que cela se produise), définissez-le comme un article prioritaire temporaire et évaluez le prix total.

  4. totalprice est court pour enfant :: totalprice. Il n'y a qu'un seul élément de prix total sur l'axe enfant du nœud de focus temporaire, donc le résultat final est une séquence d'un nœud, qui est le nœud de prix total.

Comprendre par des diagrammes

Veuillez regarder cette page pour une illustration des axes.

Voici une copie du diagramme de cette page pour précédent-frère ::. Dans celui-ci, le nœud de référence est Charlie et le nœud sur l'axe précédent-frère :: est en vert. C'est le seul nœud de ce type. enter image description here

70
Sean B. Durkin

Axes utiles pour la navigation dans l'arborescence des nœuds. Cela dépend donc de votre problème quel type d'axe est utile.

La feuille de style suivante illustre la différence.

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

Le frère précédent obtient tous les frères de l'élément qui l'ont précédé dans le niveau de nœud actuel. Sauf si vous spécifiez un ou plusieurs de ces frères et sœurs précédents avec une expression xpath. Si vous spécifiez un frère précédent spécifique avec xpath, il commence toujours par 1 entre crochets.

Ancêtre est le premier ancêtre correspondant qui correspond à l'expression. Il remonte donc l'arborescence des nœuds pour regarder une expression correspondante en fonction de l'endroit où vous pointez actuellement. Donc, si vous étiez au produit/inventaire/boisson/pop ou simplement/pop, l'inventaire ancêtre/prix total recherche simplement la première occurrence et il ne devrait renvoyer qu'un pointeur pour pointer vers le cas correspondant, sinon il ne pointera vers rien et vous vais toujours pointer du pop.

2
RetroCoder