2012-06-04 27 views
35

¿Podrías ayudarme a encontrar todos los elementos b que tienen el elemento hijo c en el siguiente ejemplo?XPath encuentra todos los elementos con nodo hijo específico

<a> 
    <b name = "b1"></b> 
    <b name = "b2"><c/></b> 
    <b name = "b3"></b> 
</a> 

la consulta XPath debe devolver el elemento b2

La segunda pregunta es quiero combinar 2 condiciones: Quiero obtener el elemento que tiene name = "b2" y tiene el elemento c sin embargo, esta sintaxis no parece funcionar: // b [@ name = 'b2' y c]

+0

¿Qué significa exactamente "parece que no funciona"? Haga una pregunta nueva y separada y proporcione el documento XML de origen completo (lo más pequeño posible), la expresión XPath utilizada y el resultado deseado y el resultado real que obtuvo. Con el documento XML actual, la expresión XPath '// b [@ name = 'b2' yc]' selecciona el segundo hijo de 'a', exactamente como debería. –

Respuesta

43

Siempre que la estructura del documento XML se sabe, es mejor evitar el uso de la // XPath pseudo-operador, ya que su uso puede resultar en una gran ineficiencia (recorrido de toda la estructura del documento).

Por lo tanto, yo recomiendo este expresión XPath para el documento XML proporcionado:

/*/b[c] 

Esto selecciona cualquier elemento b que es un hijo del elemento superior del documento XML y que tiene un elemento hijo llamado c .

ACTUALIZACIÓN: El PO hizo una pregunta secons hace unos minutos:

La segunda cuestión es que quiero combinar 2 condiciones: Quiero llegar el elemento que tiene name = "b2" y tiene el elemento C, pero esta sintaxis parece no funcionar: //b[@name='b2' and c]

la expresión XPath proporcionado hace seleccionar exactamente º e elemento deseado

Aquí es XSLT - basado verificación:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="/*"> 
    <xsl:copy-of select="//b[@name='b2' and c]"/> 
</xsl:template> 
</xsl:stylesheet> 

Cuando se aplica esta transformación en el documento XML proporcionado:

<a> 
    <b name = "b1"></b> 
    <b name = "b2"><c/></b> 
    <b name = "b3"></b> 
</a> 

la expresión XPath se evalúa y la correcta -seleccionado elemento se copia a la salida:

<b name="b2"> 
    <c/> 
</b> 
+0

Uso python para seleccionar el elemento Si uso: root.findall ("b [c]") El resultado es lo que deseo Pero si uso root.findall ("b [@ name = 'b2' y c] ") Tengo el error" predicado invalide " ¿Tal vez abra otra pregunta para Python? – nam

+0

@HOAINAMNGUYEN: Sí, la apertura de otra pregunta parece lo correcto, parece ser un problema relacionado con Python. –

+1

Solo quería decir a otro gracias a @DimitreNovatchev por estar ahí para otra pregunta de xpath :) –

19

debe ser tan simple como

//b[c] 

es decir, encuentre un b en cualquier lugar que tenga un hijo c.

+0

¡Gracias por el aperitivo! ¡Funciona! – nam

+0

Hola, ahora quiero combinar 2 condiciones: quiero obtener el elemento que tiene name = "b2" y tiene el elemento c Pero esta sintaxis parece no funcionar: // b [@ name = 'b2' y c] – nam

+0

Funciona para mí (usando xsh en Perl). – choroba

Cuestiones relacionadas