2009-02-12 21 views
23

Ésta es la estructura de mi XML de origen:XSLT - ¿Cómo seleccionar el atributo XML por atributo?

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

de la que me gusta crear algunas variables, por ejemplo, de todo con Valor1 = "2" y todo ello con Valor1 = "5" debe dar lugar a MyVar1 con anythingA2 y myvar2 con anythingA5

Mi approch se parece a esto

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

pero por supuesto no está funcionando desde Valor2 es ningún hijo de Value1.

gracias por cualquier pista con anticipación!

Respuesta

44

Basta con retirar la barra después de Data y agregar el prefijo a la raíz:

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

-1 esto no funciona sin el nodo raíz –

+0

@Andrew Hare: corregido. Gracias a Quassnoi por elaborar, perdí la conexión inmediatamente después de publicar la primera revisión. – phihag

4

Hay dos problemas con su XPath - primero que hay que quitar el selector de hijo de en pos de Data como phihag mencionado. También olvidó incluir root en su xpath. Esto es lo que desea hacer:

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

probar este

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

El '//', buscará conjunto de datos a cualquier profundidad

0

lo haría mediante la creación de una variable que puntos a los nodos que tienen el valor adecuado en Value1 y luego se refieren a t

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

Las demás respuestas también son correctas - mo De hecho, estoy en lo cierto ya que no noté la barra extra en tu XPATH que ensuciaría las cosas. Aún así, esto también funcionará, y podría funcionar para diferentes cosas, así que mantenga este método en su caja de herramientas.

+0

¿Las cosas 1, 2, 3 son hipotéticas? Tengo álbum Nombre del artista Un artista B>, y yo estoy tratando de seleccionar todos los artistas de hermanos y atarlos a una tabla intermediario conectado al disco, sin tener artistas duplicados de mi enorme base de datos. ¿Algunas ideas? –

2

Nota: usar // al comienzo de xpath es un poco intensivo en la CPU - buscará en cada nodo una coincidencia. Usar una ruta más específica, como/root/DataSet creará una consulta más rápida.

+4

Como esto no responde a la pregunta, debe ser un comentario sobre la pregunta del OP. –

Cuestiones relacionadas