67 votes

Nœud actuel vs nœud de Contexte dans XSLT/XPath?

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

Quand voulez-vous utiliser l'un ou l'autre? Comment faites vous allusion?

82voto

Paul A Jungwirth Points 3580

Le nœud actuel est celui que le modèle est actuellement en exploitation. Normalement, cela se trouve également être le nœud de contexte, mais le nœud de contexte a une signification spéciale dans un imbriquée expression XPath (la partie entre crochets). Là, il se réfère à tout noeud est actuellement à l'essai pour un match. Par conséquent, le nœud de contexte des changements dans l'expression XPath, mais pas le nœud courant.

Le nœud de contexte peut être abrégé par un point (.) ou parfois complètement. C'est probablement un peu confus, parce qu'en dehors d'une expression imbriquée, un point signifie que le nœud courant. (Dans ce cas, le nœud actuel se trouve être le nœud de contexte, donc on pourrait dire que c'est le nœud actuel seulement immédiate, et il est plus correctement appelé le nœud de contexte. Mais même les spec appelle le nœud courant ici).

Depuis un point vous donne le nœud de contexte, dans une étude de l'expression XPath l'utilisateur a besoin d'une manière de renvoyer à l'actuel nœud, celui-ci étant traitées par le modèle en cours. Vous pouvez le faire via l' current() fonction.

La distinction de ces deux est utile dans certains cas. Par exemple, supposons que vous avez un peu de 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>

Maintenant, supposons que vous souhaitez convertir en LaTeX comme ceci:

foo\footnote{Batteries not included.}
bar

baz
aak\footnote{Some assembly required.}

eep
blech\footnotemark[2]

L'astuce est de le dire si une note de bas de page a déjà été utilisé ou non. Si c'est la première fois que vous avez rencontré dans la note de bas de page, vous voulez écrire un \footnote commande; sinon, vous voulez écrire un \footnotemark commande. Vous pouvez utiliser XSL code 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 le contexte nœud- fn d'attribut (à partir des résultats de l' preceding::* node-set) à l'actuel nœud- fn d'attribut. (Vous n'êtes pas obligé de dire ./@fn; vous pouvez simplement dire @fn.)

Donc, en bref, le nœud de contexte vous laisse à l'intérieur de la XPath prédicat; le nœud courant atteint à l'extérieur du prédicat, vers le nœud en cours de traitement par le modèle en cours.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X