XPath ancêtre et descendant en XSL-copie de
Je suis nouveau sur XPath, et de ce que j'en ai lu quelques tutoriels sur les axes, je suis toujours demander comment les mettre en œuvre. Ils ne sont pas tout à fait de se comporter comme je l'avais prévu. Je suis particulièrement intéressé par l'aide de l'ancêtre et descendant axes.
J'ai la structure XML suivante:
<file>
<criteria>
<root>ROOT</root>
<criterion>AAA</criterion>
<criterion>BBB</criterion>
<criterion>CCC</criterion>
</criteria>
<format>
<sort>BBB</sort>
</format>
</file>
Et j'ai le texte suivant XSL:
<xsl:template match="/">
<xsl:copy-of select="ancestor::criterion/>
</xsl:template>
qui ne produit rien du tout!
Je m'attendais à produire:
<file>
<criteria>
</criteria>
</file>
Quelqu'un peut m'expliquer ancêtre et descendant axes pour moi plus utile que les tutoriels que j'ai déjà lus?
Merci!
Bonne question (+1). Voir ma réponse pour une explication et une solution complète.
OriginalL'auteur developer | 2010-06-01
Vous devez vous connecter pour publier un commentaire.
Comme il se doit!
est une expression relative, ce qui signifie qu'il est évalué le courant de nœud (adapté par le modèle). Mais le nœud est le nœud du document
/
.Donc, le ci-dessus est équivalente à:
Toutefois, par définition, le nœud de document
/
n'a pas de parents (et qui signifie pas d'ancêtres), de sorte que cette expression XPath ne choisissez pas n'importe quel nœud.Ce que vous avez probablement voulu, c'était:
ou
Les deux dernières expressions XPath sont équivalentes et sélectionnez tous les éléments qui ont un
criterion
descendant.Enfin, pour produire le résultat voulu, voici une solution possible:
Lorsque cette transformation est appliquée à un document XML, la sortie est produite:
Pourquoi attendez-vous à une expression XPath qui permet de sélectionner des nœuds spécifiques pour sélectionner d'autres nœuds? Dans le cas où vous avez un autre problème, il suffit de poser une autre question. Vous n'avez pas posé la question qui n'est pas répondu. 🙂
OriginalL'auteur Dimitre Novatchev
ancestor
est pour la sélection des nœuds qui sont plus élevés (plus proche de la racine) dans le document XML.descendant
est pour la sélection des nœuds qui sont plus faibles (les enfants) dans le document XML.Dans votre exemple,
ancestor::criterion
sélectionne rien, car le nœud actuel est/
(sens de la racine du document -<file>
dans ce cas), comme indiqué parmatch="/"
. Le nœud racine n'a pas d'ancêtres, de sorte que leancestor
axe ne fait rien.Pour obtenir tous les
<criterion>
élément, vous devez utiliser ledescendant
axe:Ou son raccourci
//
:Qui sera de retour le suivant:
À l'aide d'une boucle ou d'un autre modèle, vous pouvez obtenir toutes les trois d'entre eux:
Cela permettra de produire les éléments suivants:
Si vous voulez obtenir le
<file>
élément, trop, c'est un peu plus compliqué. XPath spécifie les nœuds et les copies de ne pas copier les éléments qui contiennent les éléments que vous sélectionnez. Je peux clarifier ce point plus si vous êtes encore confus.<xsl:template match="/"> <xsl:copy-of select="//criterion"/> </xsl:template>
sera de retour le suivant:<criterion>AAA</criterion>
Ce n'est pas ainsi. Le résultat sera: ` <critère>AAA</critère> <critère>BBB</critère> <critère>CCC</critère> `Juste un point, mais
descendant::criterion
n'est PAS équivalent à//criterion
; ce dernier permettra de trouver tous les critère de nœuds dans l'ensemble du document. Le bon raccourci est.//criterion
.OriginalL'auteur Welbog