2011-09-17 18 views
8

Come posso ottenere utilizzando XSLT, valore del nodo alla posizione X, senza l'utilizzo di foreachUsando XSLT ottenere valore del nodo alla posizione X

<items> 
<item1>x</item1> 
<item2>x</item2> 
<item3>x</item3> 
</items> 

Questo è spiegato nella programmazione senso:

<xsl:value-of select="Items/Item[2]"/> 

== ================================================

Solo per espandere la domanda, nel seguente XML:

<items> 
    <about>xyz</about> 
    <item1> 
     <title>t1</title> 
     <body>b1</body> 
    </item1> 
    <item2> 
     <title>t2</title> 
     <body>b2</body> 
    </item2> 
    <item3> 
     <title>3</title> 
     <body>3</body> 
    </item3> 
</items> 

Come è possibile selezionare il titolo dell'articolo di secondo.

+0

Buona domanda, +1. Si noti che la maggior parte delle risposte contiene espressioni che, a seconda del documento XML, possono potenzialmente selezionare un 'titolo' che non è figlio di un elemento' item'XYZ. –

risposta

16

risposta alla domanda espanso. È possibile utilizzare il valore posizionale se si seleziona un set di nodi degli elementi desiderati:

<xsl:value-of select="(items//title)[2]"/> 

o:

<xsl:value-of select="(items/*/title)[2]"/> 

Nota l'uso della parentesi necessaria per tornare ricercato set-nodo prima di scegliere da posizione.


È possibile utilizzare ciò che è stato chiamato "in senso di programmazione". Tuttavia è necessario * a causa del nome sconosciuto degli elementi figli:

<xsl:value-of select="items/*[2]"/> 

Nota che i nodi-set in XSLT non sono a base zero. Nel modo in cui sopra stai selezionando il secondo articolo, non il terzo uno.

Hai davvero bisogno position() quando si desidera confrontare la posizione corrente con un numero come in:

<xsl:value-of select="items/*[position()>2]"/> 

per selezionare tutto voce con la posizione grattugia di 2. altro caso in cui è position() indespensible è quando valore di posizione è una variabile di tipo stringa :

<xsl:variable name="pos" select="'2'"/> 
<xsl:value-of select="items/*[position()=$pos]"/> 
+0

Ho risposto alla domanda estesa. Spero che sia d'aiuto. –

+1

Questo mi ha aiutato molto con un problema simile. Ottima soluzione, grazie. –

2

È possibile utilizzare la posizione()

<xsl:value-of select="/items/*[position()=2]/text()"/> 
2

Si potrebbe fare con

<xsl:value-of select="items/child[position()=2]"/> 
4

Solo per espandere domandina, nel seguente codice XML:

<items> 
    <about>xyz</about> 
    <item1> 
     <title>t1</title> 
     <body>b1</body> 
    </item1> 
    <item2> 
     <title>t2</title> 
     <body>b2</body> 
    </item2> 
    <item3> 
     <title>3</title> 
     <body>3</body> 
    </item3> 
</items> 

Come faccio a selezionare del secondo titolo oggetto.

Uso:

/*/*[starts-with(name(), 'item')][2]/title 

Questo seleziona: tutti title elementi che sono figli del secondo di tutti i bambini-elementi dell'elemento superiore, i cui nomi cominciano con la stringa "item".

Da notare che espressioni come:

(items/*/title)[2] 

o

(items//title)[2] 

non sono corrette, in generale, perché se nel documento XML ci sono altri elementi come (diciamo) "chapter" che hanno figli title, le espressioni sopra possono selezionare un elemento chapter/title - ma il Il compito qui è selezionare il secondo title nel documento il cui genitore potrebbe essere solo un elemento item XYZ.

+0

+1 per una soluzione più generale. Tuttavia, le espressioni nella mia risposta sono corrette_ nel campione fornito; potrebbero ovviamente funzionare in modo errato se il documento di input cambia. Questo può accadere anche alla tua espressione fornita. –

+0

@empo: Grazie e sì, mentre la mia soluzione è più generale e robusta della tua, c'è sempre la possibilità che modifiche ancora più radicali possano rendere * qualsiasi * una soluzione inadatta. Quindi, di solito mi interessano le variazioni che sono * del tutto possibili *, ma * non estreme *. –

+0

Sono d'accordo, ma per dire che le espressioni che ho usato nella mia risposta non sono corrette_ non è corretto :). Puoi dire che quelle espressioni sono meno robuste e potrebbero non riuscire se il documento di input cambia. –

Problemi correlati