web-dev-qa-db-fra.com

Noeud actuel vs noeud contextuel dans XSLT / XPath?

Dans XSLT, quelle est la différence entre le "nœud actuel" et le "nœud de contexte"? Vous pouvez trouver les deux termes utilisés ici: http://www.w3.org/TR/xslt .

Quand utiliseriez-vous l'un ou l'autre? Comment vous référez-vous à chacun?

63
Paul A Jungwirth

Le nœud actuel est celui sur lequel le modèle fonctionne actuellement. Normalement, cela se trouve également être le nœud de contexte, mais le nœud de contexte a une signification particulière dans une expression XPath imbriquée (la partie entre crochets). Là, il fait référence à n'importe quel nœud actuellement testé pour une correspondance. Par conséquent, le nœud de contexte change dans l'expression XPath, mais pas le nœud actuel.

Le nœud de contexte peut être abrégé par un point (.) Ou parfois complètement supprimé. C'est probablement un peu déroutant, car en dehors d'une expression imbriquée, un point signifie le nœud actuel. (Dans ce cas, le nœud actuel se trouve être le nœud de contexte, donc on pourrait dire qu'il n'est le nœud actuel que de manière proximale, et il est plus correctement appelé le nœud de contexte. Mais même la spécification l'appelle ici le nœud actuel.)

Puisqu'un point vous donne le nœud de contexte, dans une expression XPath imbriquée, l'utilisateur a besoin d'un moyen de se référer au nœud actuel, celui qui est traité par le modèle actuel. Vous pouvez le faire via la fonction current().

Distinguer ces deux est utile dans certains cas. Par exemple, supposons que vous ayez du XML comme ceci:

<a>
    <b>
        <c>foo<footnote fn="1"/></c>
        <d>bar</d>
    </b>
    <b>
        <c>baz</c>
        <d>aak<footnote fn="2"/></d>
    </b>
    <b>
        <c>eep</c>
        <d>blech<footnote fn="2"/></d>
    </b>
    <footnote-message fn="1">Batteries not included.</footnote>
    <footnote-message fn="2">Some Assembly required.</footnote>
</a>

Supposons maintenant que vous souhaitiez le convertir en LaTeX comme ceci:

foo\footnote{Batteries not included.}
bar

baz
aak\footnote{Some Assembly required.}

eep
blech\footnotemark[2]

L'astuce consiste à dire si une note de bas de page a déjà été utilisée ou non. Si c'est la première fois que vous rencontrez la note de bas de page, vous voulez écrire une commande \footnote; sinon vous voulez écrire une commande \footnotemark. Vous pouvez utiliser du code XSL comme ceci:

<xsl:choose>
    <xsl:when test="count(preceding::*[./@fn = current()/@fn]) = 0">\footnote{...}</xsl:when>
    <xsl:otherwise>\footnotemark[...]</xsl:otherwise>
</xsl:choose>

Ici, nous comparons l'attribut context-node fn (à partir des résultats de l'ensemble de nœuds preceding::*) À l'attribut current-node fn. (Vous n'avez pas besoin de dire ./@fn; Vous pouvez simplement dire @fn.)

Donc, en bref, le nœud de contexte vous laisse à l'intérieur du prédicat XPath; le nœud actuel atteint en dehors du prédicat, retourne au nœud en cours de traitement par le modèle actuel.

70
Paul A Jungwirth

Contexte Noeud

Le nœud de contexte fait partie du XPathcontexte d'évaluation et varie avec chaque étape de localisation :

step1 / step2 / step3 / ...

où chaque step est

axis::node-test[predicate]
  • Chaque étape est évaluée par rapport aux nœuds de contexte définis par les étapes précédentes.
  • Chaque étape sélectionne ensuite les nœuds qui deviennent le nœud de contexte pour les étapes suivantes.
  • Lors de l'évaluation de predicate, le nœud de contexte est le nœud le long de axis qui a passé node-test.
  • Le nœud de contexte est accessible en tant que ..

Actuel Noeud

Le nœud actuel () fait partie du [ ~ # ~] xslt [~ # ~]modèle de traitement :1

  • Le nœud actuel est le nœud du document XML source qui correspond le mieux à un modèle XSLT.
  • Le nœud actuel devient le nœud de contexte de départ pour chaque expression XPath dans le modèle correspondant.
  • Le nœud actuel est accessible en tant que current() dans les prédicats XPath.

1Bien qu'il soit insignifiant pour comprendre la différence fondamentale entre le nœud de contexte et le nœud actuel, notez que dans XSLT 2. la description du contexte d'évaluation a été modifiée. Les concepts de nœud actuel et de liste de nœuds actuels ont été remplacés par les concepts XPath de élément de contexte , position du contexte et contexte taille.

2
kjhughes