2012-03-29 11 views
5

Esiste un modo per limitare una sezione di XSLT a un singolo nodo, in modo che l'intero percorso del nodo non sia necessario ogni volta?Limitazione della sezione di XSLT al nodo singolo

Per esempio ...

Name: <xsl:value-of select="/root/item[@attrib=1]/name"/> 
Age: <xsl:value-of select="/root/item[@attrib=1]/age"/> 

Ciò potrebbe essere fatto attraverso un per-ogni comando, ma io sono portato a credere che questi dovrebbero essere evitati se possibile ...

<xsl:for-each select="/root/item[@attrib=1]"/> 
    Name: <xsl:value-of select="name"/> 
    Age: <xsl:value-of select="age"/> 
</xsl:for-each> 

Suppongo che sto chiedendo se esiste un equivalente XSLT del comando VB.NET Con?

Preferirei evitare xsl: modello per la leggibilità, poiché il file XSLT in questione è grande, ma felice di accettare se questo è l'unico modo per farlo. E se sì, qual è la sintassi per chiamare un modello particolare basato su nodo specifico?

Aggiornamento

Nel follow-up alla risposta da @javram, è possibile abbinare i modelli separati in base a particolari attributi/nodi.

<xsl:apply-templates select="/root/item[@attrib=1]"/> 
<xsl:apply-templates select="/root/item[@attrib=2]"/> 

<xsl:template match="/root/item[@attrib=1]"> 
    Name: <xsl:value-of select="name"/> 
    Age: <xsl:value-of select="age"/> 
</xsl:template> 

<xsl:template match="/root/item[@attrib=2]"> 
    Foo: <xsl:value-of select="foo"/> 
</xsl:template> 
+0

Non c'è niente di sbagliato di per sé con l'uso di 'xsl: for-each' come si fa qui. In questo caso, funziona bene in un modo "con". Le persone consigliano di non utilizzare 'xsl: for-each' per eseguire il loop esplicito su qualcosa quando XSLT fornisce metodi migliori per eseguire l'equivalente, ad esempio lasciando che i modelli si applichino e corrispondano. –

+0

Downvoter ... posso chiederti perché, e dopo così tanto tempo? – freefaller

+0

Downvoter ... no non pensavo così ... ti nascondi dietro l'anonimato di SO, piuttosto che essere costruttivo. Grazie, grazie mille! – freefaller

risposta

2

Il modo corretto sarebbe quello di utilizzare un modello:

<xsl:apply-templates select="/root/item[@attrib=1]"/> 

. 
. 
. 

<xsl:template match="/root/item"> 
    Name: <xsl:value-of select="name"/> 
    Age: <xsl:value-of select="age"/> 
</xsl:template> 
+0

Anche se non è visivamente bello come un blocco di tipo "Con", penso che tu abbia ragione che questo è il modo corretto di farlo. Poiché le domande sulle domande non sono consentite tramite i commenti, potresti essere abbastanza gentile da mostrare come verrebbero abbinati a un modello diverso se il @attrib è stato modificato?Aggiornerò la mia domanda per riflettere questa richiesta – freefaller

+0

Si prega di ignorare la domanda di follow-up, è stato piuttosto facile di quanto pensassi, ho aggiornato la mia domanda in modo appropriato – freefaller

+0

Nel tuo aggiornamento di follow-up, avresti potuto fare anche: che avrebbe salvato una riga di codice. Dal momento che l'attributo era già incluso nei criteri di corrispondenza separati, entrambi i modelli sarebbero comunque colpiti. – javram

2

È possibile utilizzare variabili:

<xsl:variable name="foo" select="/root/item[@attrib=1]" /> 

<xsl:value-of select="$foo/name" /> 
<xsl:value-of select="$foo/age" /> 
+0

Non avevo idea che le variabili potessero contenere anche i nodi, grazie per questo. – freefaller

0

In XSLT 2.0 un altro stile possibile è:

<xsl:value-of select='/root/item[@attrib=1]/ 
         concat("Name: ", name, " Age: ", age)'/> 
+0

Sfortunatamente siamo ancora su 1.0, e il blocco delle copertine "Con" è troppo grande perché "concat" sia utile. Ma apprezzo l'input, grazie. – freefaller

0

Questo:

<xsl:for-each select="/root/item[@attrib=1]"/> 
    Name: <xsl:value-of select="name"/> 
    Age: <xsl:value-of select="age"/> 
</xsl:for-each> 

discende in tutti i nodi (ogni nodo corrispondente, uno per uno).

questo:

<xsl:for-each select="(/root/item[@attrib=1])[1]"/> 
    Name: <xsl:value-of select="name"/> 
    Age: <xsl:value-of select="age"/> 
</xsl:for-each> 

discese in prima (forse solo) nodo di corrispondenza ed è equivalente di VB.NET With economico come si voleva.

Problemi correlati