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?
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.
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]
predicate
, le nœud de contexte est le nœud le long de axis
qui a passé node-test
..
.Le nœud actuel () fait partie du [ ~ # ~] xslt [~ # ~]modèle de traitement :1
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.