2009-06-20 10 views

Répondre

68

Le nœud actuel est celui sur lequel le modèle fonctionne actuellement. Normalement, il s'agit également du nœud contextuel, mais le nœud contextuel a une signification particulière dans une expression XPath imbriquée (la partie entre crochets). Là, il se réfère à n'importe quel nœud est 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 noeud de contexte peut être abrégé avec un point (.) ou parfois être complètement omis. C'est probablement un peu déroutant, car en dehors d'une expression imbriquée, un point signifie le nœud courant. (Dans ce cas, le nœud actuel se trouve être le nœud de contexte, donc on peut dire que c'est le nœud courant seulement, et il est plus correctement appelé le nœud de contexte, mais même la spécification l'appelle le nœud actuel ici.)

Étant donné qu'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 courant. Vous pouvez le faire via la fonction current().

Distinguer ces deux est utile dans certains cas. Par exemple, supposons que vous avez un 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 voulez convertir en LaTeX comme ceci:

foo\footnote{Batteries not included.} 
bar 

baz 
aak\footnote{Some assembly required.} 

eep 
blech\footnotemark[2] 

L'astuce est dire si une note a déjà été utilisé ou ne pas. 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 le 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 le contexte nœud fn attribut (à partir des résultats de l'ensemble de nœuds preceding::*) au nœud courant fn attribut. (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 noeud courant atteint l'extérieur du prédicat, revient au noeud en cours de traitement par le modèle courant.

+1

Comment cela se rapporte-t-il à l'auto-axe? – Devela

Questions connexes