2011-05-17 18 views
29

Por ejemplo:¿Cómo seleccionar dos atributos del mismo nodo con una expresión en XPath?

//person[@id='abc123']/@haircolor|/@weight" 

PS. hay muchos registros de "persona"

+0

No pude hacer nada mejor que '// persona [@ id = 'abc123']/@ haircolor | // persona [@ id = 'abc123']/@ weight'. Parece que '// persona [@ id = 'abc123']/(@ haircolor | @weight)' no funciona porque '|' tiene que estar en el primer nivel. – Kobi

+0

¿Desea seleccionar elementos de todas las personas según las condiciones de los atributos o desea seleccionar el valor de los atributos? –

+0

@Kobi: su "mejor" le mostrará solo '@ haircolor', y' @ weight' en el caso '@ haircolor' no existe. –

Respuesta

48

Prueba esto:

//person[@id='abc123']/@*[name()='weight' or name()='haircolor'] 

Si está utilizando un procesador de XPath 2.0, también puede utilizar una opción más bonita:

//person[@id='abc123']/(@haircolor|@weight)` 
+2

'// persona [@ id = 'abc123']/(@ haircolor | @weight)' es válida XPath, pero necesita un procesador XPath 2.0 para ejecutarlo. –

+0

@Michael - ¡Gracias, es bueno saber! Desafortunadamente, suelo lidiar con la versión anterior. De todos modos, tomaré su palabra y actualizaré la respuesta. Gracias de nuevo. – Kobi

+0

@Kobi - ¿también es posible concatinar la salida? Porque ejecutar mi expresión XPath en función de su respuesta me lleva a una salida doble. – Vilius

23

¿Desea buscar nodos persona en función del valor de atributos múltiples. Si esa es la pregunta, entonces puedes usar ands, p.

//person[@id='abc123' and @haircolor='blue' and @weight='...'] 

Si desea buscar en un solo atributo, pero devolver los valores de los otros atributos, me gustaría hacer algo como esto:

<xsl:template match="person[@id='abc123']"> 
    <xsl:value-of select="@haircolor"/> 
    <xsl:value-of select="@weight"/> 
    </xsl:template> 
+0

no, solo busca en 1, pero devuelve 2 atributos – jacob

2

Si usted está tratando de obtener los valores de la atributos especificados Sugeriría introducir una variable para la persona solicitada.

<xsl:variable name="person" select="//person[@id = 'abc123']" /> 

Después de eso, puede obtener cualquier atributo de la persona solicitada utilizando la variable especificada.

<xsl:value-of select="$person/@haircolor" /> 
<xsl:value-of select="$person/@weight" /> 
Cuestiones relacionadas