2009-06-20 17 views

risposta

68

Il nodo corrente è qualunque sia il modello attualmente operativo. Normalmente questo accade anche al nodo contesto, ma il nodo contesto ha un significato speciale all'interno di un'espressione XPath annidata (la parte tra parentesi quadre). Lì, si riferisce a qualsiasi nodo viene attualmente testato per una corrispondenza. Quindi, il nodo di contesto cambia all'interno dell'espressione XPath, ma non il nodo corrente.

Il nodo di contesto può essere abbreviato con un punto (.) o talvolta escluso completamente. Questo è probabilmente un po 'di confusione, perché al di fuori di un'espressione annidata, un punto indica il nodo corrente. (In questo caso il nodo corrente sembra essere il nodo di contesto, quindi si potrebbe dire che è il nodo corrente solo in modo approssimato, ed è più propriamente chiamato il nodo di contesto. Ma anche la specifica lo chiama il nodo corrente qui.)

Poiché un punto fornisce il nodo di contesto, in un'espressione XPath nidificata l'utente ha bisogno di un modo per fare riferimento al nodo corrente, quello che viene elaborato dal modello corrente. È possibile farlo tramite la funzione current().

Distinguere questi due è utile in alcuni casi. Per esempio, supponiamo di avere un po 'di XML in questo modo:

<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> 

Ora supponiamo che si desidera convertire in LaTeX in questo modo:

foo\footnote{Batteries not included.} 
bar 

baz 
aak\footnote{Some assembly required.} 

eep 
blech\footnotemark[2] 

Il trucco è il dire se una nota è già stato utilizzato o non. Se è la prima volta che si incontra la nota a piè di pagina, si desidera scrivere un comando \footnote; altrimenti si desidera scrivere un comando \footnotemark. Si potrebbe utilizzare il codice XSL come questo:

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

Qui stiamo confrontando l'attributo contesto nodi fn (dai risultati del preceding::* nodo-set) per l'attuale nodo fn attributo. (In realtà non è necessario dire ./@fn; si potrebbe semplicemente dire @fn.)

Quindi, in breve, il nodo di contesto ti lascia all'interno del predicato XPath; il nodo corrente raggiunge all'esterno del predicato, di nuovo al nodo in elaborazione dal modello corrente.

+1

come si riferisce all'asse reale? – Devela

Problemi correlati