Cómo filtrar con XPath en todos los elementos sin un atributo específico
Pregunta
Mi XPath está un poco oxidado ... Digamos que tengo este simple archivo XML:
<?xml version="1.0" encoding="utf-8" ?>
<States xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<States>
<StateProvince name="ALABAMA" abbrev="AL" />
....
<StateProvince name="AMERICAN SAMOA" abbrev="AS" territory="true" />
</States>
</States>
Me gustaría ejecutar una consulta XPath simple para analizar todos los estados verdaderos (así que no tire de los estados donde territorio = verdadero). Intenté \ StateProvince [@territory! = 'True'] pero obtuve cero. Otras variaciones parecen estar fallando. Esto parece que debería ser simple, pero no encontrar lo que quiero.
Cualquier ayuda apreciada.
Solución
Una expresión XPath que selecciona los elementos deseados :
& lbsp Tome nota de que se debe evitar la abreviatura //
siempre que sea posible ya que causa todo el documento (subárbol arraigado en la nodo de contexto) para ser escaneado .
La expresión XPath anterior evita el uso de
abreviatura teniendo en cuenta la estructura de el documento XML proporcionado originalmente. //
Solo si la estructura del documento XML es completamente desconocida (y la expresión XPath está diseñada para usarse en muchos documentos XML con estructura desconocida) si el uso del //
la abreviatura se considerará .
Otros consejos
Estás muy cerca:
//StateProvince[not(@territory) or @territory != 'true']
Debería conseguirte el resultado que deseas.
Esto debería funcionar:
//StateProvince[not(@territory='true')]