xpath contains text
Prueba de un atributo XML (4)
Quiero saber qué elementos tienen un atributo src , cuáles están vacíos y cuáles tienen valores.
Elementos que tienen un atributo @src
que está vacío (sin valor de cadena):
//*[@src[not(string())]]
Elementos que tienen un atributo @src
que tiene valor (cadena-valor):
//*[string(@src)]
Desde http://www.w3.org/TR/xpath/#section-String-Functions
Un conjunto de nodos se convierte en una cadena devolviendo el valor de cadena del nodo en el conjunto de nodos que está primero en el orden del documento. Si el conjunto de nodos está vacío, se devuelve una cadena vacía.
Desde http://www.w3.org/TR/xpath/#function-boolean
Una cadena es verdadera si y solo si su longitud no es cero.
Tengo una pieza de XML así:
<root>
<foo src=""/>
<foo src="bar"/>
<foo />
</root>
Quiero saber qué elementos tienen un atributo src , cuáles están vacíos y cuáles tienen valores.
Lo más lejos que he venido es con
$ xmlstarlet sel -t -m ''//foo'' -v @src -n foo.xml
bar
Aunque eso no me dice que al tercer foo le falta el atributo.
Esto seleccionará los foos sin atributo src
.
/root/foo[not(@src)]
Para las otras dos tareas, usaría una combinación de las expresiones señaladas por @TOUDIdel y @Dimitre Novatchev: /root/foo[@src and string-length(@src)=0]
para foos con un src
vacío, y /root/foo[@src and string-length(@src)!=0]
para foos con un src
con contenido en él.
Dejando de lado, evitaría usar el selector "en cualquier lugar", //
(sin mencionar el *
comodín), a menos que esté seguro de que esto es específicamente lo que necesita. //
es como hacer que tu perro ansioso huela un pedazo de tela y le diga: "Tráeme todo lo que huele así, donde sea que lo encuentres". No vas a creer la extraña mierda que puede decidir traer de vuelta.
/root/foo[string-length(@src)!=0]
devolver todos los elementos foo no tienen un valor vacío.
Desafortunadamente /root/foo[string-length(@src)=0]
indica los elementos que no tienen el atributo src y también los elementos tienen el atributo src pero están vacíos.
Uso :
//*[@src and not(string-length(@src))]
Esto selecciona todos los elementos en el documento XML que tienen un atributo src
cuyo valor de cadena tiene una longitud de cero.
//*[@src and string-length(@src)]
Esto selecciona todos los elementos en el documento XML que tienen un atributo src
cuyo valor de cadena tiene una longitud que no es cero.
//*[@src and string-length(normalize-space(@src))]
Esto selecciona todos los elementos en el documento XML que tienen un atributo src
cuyo valor de cadena después de excluir el espacio en blanco inicial y final tiene una longitud que no es cero.
//[not(@src)]
Esto selecciona todos los elementos en el documento XML que no tienen un atributo src
.