sintassi XSLT e Xpath> come fare riferimento a un elemento in un ambito 'esterno'

StackOverflow https://stackoverflow.com/questions/1843693

  •  12-09-2019
  •  | 
  •  

Domanda

Ho il seguente funziona correttamente al 100%. Tuttavia, per soddisfare la mia curiosità ... c'è un modo per ottenere lo stesso senza dichiarare la variabile CurrentID? C'è qualche modo per farvi riferimento dall'interno del "test" condizione XPath?

La query XPath nella condizione deve fare riferimento a 2 @id attributi per vedere se corrispondono.

  • la 'corrente' @id
  • ogni 'antenato' @id

Ecco il codice:

<xsl:variable name="currentID" select="@id" />
<xsl:attribute name="class">
<xsl:if test="count($currentPage/ancestor::node [@id = $currentID])&gt;0">descendant-selected </xsl:if>
</xsl:attribute>
È stato utile?

Soluzione

Dal momento che si seleziona la $currentID dal nodo di contesto:

<xsl:variable name="currentID" select="@id" />

è possibile utilizzare la funzione di current(), che si riferisce sempre al nodo contesto XSLT:

<xsl:attribute name="class">
  <xsl:if test="count($currentPage/ancestor::node[@id = current()/@id) &gt; 0]">
    <xsl:text>descendant-selected </xsl:text>
  </xsl:if>
</xsl:attribute>

In questo modo non hai bisogno di una variabile.

A poche altre note:

  • Mi consiglia di utilizzare <xsl:text> come indicato sopra. Questo ti dà più libertà per formattare il codice ed evitare le linee eccessivamente lunghe.
  • Non c'è bisogno di fare un count() > 0, selezionando semplicemente i nodi è sufficiente. Se non esiste, il nodo-set vuoto viene restituito. Esso restituisce sempre falso, mentre non vuoti nodo-set valutano sempre true.

Se si fa riferimento ai nodi da @id regolarmente nel foglio di stile XSL, un <xsl:key> diventerebbe vantaggioso:

<xsl:key name="kNodeById" match="node" use="@id" />

<!-- ... -->

<xsl:attribute name="class">
  <xsl:if test="key('kNodeById', @id)">
    <xsl:text>descendant-selected </xsl:text>
  </xsl:if>
</xsl:attribute>

È possibile che questo non ha bisogno di current() in quanto al di fuori di un predicato XPath, il contesto è invariato. Inoltre, non count() i nodi, dal momento che questo è ridondante (come spiegato).

Altri suggerimenti

Utilizzare corrente () per fare riferimento al nodo corrente elaborati dal template:

<xsl:if test="count($currentPage/ancestor::node [@id = current()/@id])&gt;0">

Tim mi ha fatto pensare .... Penso di essere stato più di complicare le cose, e ho provato la seguente che funziona.

<xsl:if test="@id = $currentPage/ancestor::node/@id">descendant-selected </xsl:if>

XSLT sembra felice confrontando un attributo con una selezione di attributi, e valutare vero se qualcuno di loro partita? se qualcuno ha una migliore spiegazione del perché questo funziona o qualcosa di meglio (più succinta) poi messo giù.

Come è già diventato chiaro, riferendosi alla "ambito esterno" non era un problema, dal momento che si potrebbe fare un confronto diretto con l'operatore "=". Tuttavia, ci sono alcuni casi in cui si ha bisogno di corrente () e altro ancora dove anche corrente () non è tagliato (perché è necessario "join" tra più di due contesti). In questi casi, XPath 2.0 "per" le espressioni sono indispensabili.

È sufficiente potrebbe fare:

<xsl:if test="count($currentPage[ancestor::node/@id = @id])&gt;0">descendant-selected </xsl:if>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top