¿Cómo puedo extraer el valor de un nodo de atributo a través de XPath?
Un archivo XML de muestra es:
<parents name='Parents'>
<Parent id='1' name='Parent_1'>
<Children name='Children'>
<child name='Child_2' id='2'>child2_Parent_1</child>
<child name='Child_4' id='4'>child4_Parent_1</child>
<child name='Child_1' id='3'>child1_Parent_1</child>
<child name='Child_3' id='1'>child3_Parent_1</child>
</Children>
</Parent>
<Parent id='2' name='Parent_2'>
<Children name='Children'>
<child name='Child_1' id='8'>child1_parent2</child>
<child name='Child_2' id='7'>child2_parent2</child>
<child name='Child_4' id='6'>child4_parent2</child>
<child name='Child_3' id='5'>child3_parent2</child>
</Children>
</Parent>
</parents>
Hasta ahora tengo esta cadena XPath:
//Parent[@id='1']/Children/child[@name]
Solo devuelve child
elementos, pero me gustaría tener el valor del name
atributo.
Para mi archivo XML de muestra, esto es lo que me gustaría que sea la salida:
Child_2
Child_4
Child_1
Child_3
Respuestas:
Su original
child[@name]
significa un elementochild
que tiene un atributoname
. Que deseachild/@name
.fuente
Para obtener solo el valor (sin nombres de atributos), use
string()
:string(//Parent[@id='1']/Children/child/@name)
La función fn: string () devolverá el valor de su argumento como
xs:string
. En caso de que su argumento sea un atributo, devolverá el valor del atributo comoxs:string
.fuente
xqilla
que era necesario llamarxs:string
. Me pregunto porque.xs
es el prefijo del espacio de nombres para las funciones XPath. Entonces no están mezclados con otros.Deberías usar
//Parent[@id='1']/Children/child/data(@name)
Los atributos no se pueden serializar, por lo que no puede devolverlos en un resultado de aspecto xml. Lo que debe hacer es obtener los datos del atributo utilizando la función data ().
fuente
Como se respondió anteriormente:
solo generará el
name
atributo de los 4child
nodos que pertenecen alParent
especificado por su predicado[@id=1]
. Luego deberá cambiar el predicado[@id=2]
para obtener el conjunto dechild
nodos para el siguienteParent
.Sin embargo, si ignora el
Parent
nodo por completo y usa:Puede seleccionar el
name
atributo de todos loschild
nodos de una vez.fuente
Este es el caso que se puede usar cuando el elemento tiene 2 atributos y podemos obtener un atributo con la ayuda de otro.
fuente
@ryenus, debes recorrer el resultado. Así es como lo haría en vbscript;
fuente
para todos los xml con espacio de nombres use local-name ()
fuente