2010-10-01 25 views
12

Teniendo en cuenta esto:xRuta: Elija un elemento padre sólo si elemento secundario no contiene un cierto valor

<element_1> 
    <element_2>Text</element_2> 
    <element_3> 
     <element_4> 
      <element_5>Text with @ in Value</element_5> 
     </element_4> 
     <element_4> 
      <element_5>Test Text</element_5> 
     </element_4> 
    </element_3> 
    <element_6> 
     <element_7> 
      <element_8>0</element_8> 
... 

¿Cómo seleccionar todas las instancias de element_1 que hacen no contienen una '@' en element_5?

+0

Buena pregunta (+1). Vea mi respuesta para una expresión XPath general que selecciona todos los elementos requeridos en cualquier documento, cuando la estructura del documento no se conoce de antemano. –

Respuesta

14
element_1[not(contains(element_3/element_4/element_5,'@'))] 

Esto se interpreta como

element_1[       #select elements named "element_1" 
    not(contains(     #that do not contain 
    element_3/element_4/element_5, #children in this hierarchy 
    '@'        #the character @ 
)) 
] 
+1

¿Necesita esto // antes del elemento_1? – Snekse

+0

Depende si quiere hacer coincidir element_1 en cualquier nivel, o si siempre es la raíz del DOM. – dty

+1

También tenga en cuenta que esta solución supone que element_5 está siempre directamente debajo de element_4, que a su vez está siempre directamente debajo de element_3, que a su vez siempre está directamente debajo de element_1. Las otras dos soluciones suponen que element_5 puede aparecer en cualquier nivel debajo de element_1. – dty

0
element1[not(contains(.//element_5, '@'))] 
+0

¿Qué pasa con el voto a favor? –

6

Mi XPath es un poco oxidado, pero algo como esto:

//element_1[.//element_5[not(contains(., "@"))]] 
+0

Somos un poco quisquillosos y no recomendamos el operador '//' cuando el esquema es conocido ... –

+0

Eso está bien. El OP no fue específico al respecto. – dty

+1

¿Por qué el rango inferior? Al menos tenga la decencia de dejar un mensaje que diga por qué ha bajado de categoría, sea quien sea. – dty

4

¿Cómo seleccionar todas las instancias de element_1 que no contiene un '@' en element_5?

Uso:

//element_1[not(.//element_5[contains(.,'@')])] 

En Inglés, esto significa: Seleccionar todos los "element_1" elementos del documento que no tienen un descendiente "element_5" cuyo valor de cadena contiene la cadena '@'.

Estoy utilizando la abreviatura // solo porque la estructura del archivo XML no está clara.

Siempre recomiendo evitar el uso de la abreviatura // siempre que esto sea posible, porque de lo contrario, esto puede dar como resultado una evaluación XPath muy ineficiente.

+1

@ Mads-Hansen: Gracias por las ediciones, pero "descendiente" es una palabra válida en inglés. –

Cuestiones relacionadas