2009-02-12 7 views
23

questa è la struttura del mio XML di origine:XSLT - Come selezionare l'attributo XML per attributo?

<root> 
<DataSet Value="A"> 
<Data Value1="1" Value2="anythingA1" /> 
<Data Value1="2" Value2="anythingA2" /> 
<Data Value1="3" Value2="anythingA3" /> 
<Data Value1="4" Value2="anythingA4" /> 
<Data Value1="5" Value2="anythingA5" /> 
</DataSet> 
</root> 

da cui mi piace creare alcune variabili per esempio da tutti con Value1 = "2" e tutti con Value1 = "5" dovrebbe portare myVar1 con anythingA2 e MyVar2 con anythingA5

mio approch assomiglia a questo

<xsl:variable name="myVarA" select="/DataSet/Data/[@Value1='2']/@Value2" /> 

ma ovviamente non funziona in quanto Valore2 è nessun figlio di Valore1.

grazie per eventuali suggerimenti in anticipo!

risposta

44

è sufficiente rimuovere la barra dopo Data e premettere al root:

<xsl:variable name="myVarA" select="/root/DataSet/Data[@Value1='2']/@Value2"/> 
+0

-1 questo non funziona senza il nodo radice –

+0

@Andrew Hare: corretto. Grazie a Quassnoi per l'elaborazione, ho perso la connessione subito dopo aver pubblicato la prima revisione. – phihag

4

Ci sono due problemi con il XPath - Per prima cosa è necessario rimuovere il selettore bambino da dopo Data come phihag menzionato. Inoltre hai dimenticato di includere root nel tuo xpath. Ecco cosa si vuole fare:

select="/root/DataSet/Data[@Value1='2']/@Value2" 
1

Prova questa

xsl:variable name="myVarA" select="//DataSet/Data[@Value1='2']/@Value2" /> 

Il '//' cercherà i DataSet a qualsiasi profondità

0

lo farei con la creazione di una variabile che punti ai nodi che hanno il valore corretto in Valore1 quindi si riferisce a t

<xsl:variable name="myVarANode" select="root//DataSet/Data[@Value1='2']" /> 
<xsl:value-of select="$myVarANode/@Value2"/> 

Tutte le risposte degli altri sono corrette - mo Proprio così, dato che non ho notato la barra in più nel tuo XPATH che avrebbe rovinato tutto. Tuttavia, questo funzionerà anche e potrebbe funzionare per cose diverse, quindi mantieni questo metodo nella tua casella degli strumenti.

+0

L'ipotesi 1, 2, 3 è ipotetica? Ho dell'album Nome Artista Un Artist B>, e sto cercando di selezionare tutti gli artisti di pari livello e legarli a una tabella intermedia collegato al disco, senza dover artisti duplicati dal mio enorme database. Qualche idea? –

2

Nota: l'utilizzo di // all'inizio di xpath è un po 'CPU intensitve - cercherà ogni nodo per una corrispondenza. Utilizzando un percorso più specifico, come/root/DataSet creerà una query più veloce.

+4

Poiché questo non risponde alla domanda, dovrebbe essere un commento sulla domanda dell'OP. –