Jak mogę wyodrębnić wartość węzła atrybutu za pomocą XPath?
Przykładowy plik XML to:
<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>
Do tej pory mam ten ciąg XPath:
//Parent[@id='1']/Children/child[@name]
Zwraca tylko child
elementy, ale chciałbym mieć wartość name
atrybutu.
W moim przykładowym pliku XML chciałbym, aby wynik był:
Child_2
Child_4
Child_1
Child_3
Odpowiedzi:
Twój oryginał
child[@name]
oznacza element,child
który ma atrybutname
. Chceszchild/@name
.źródło
Aby uzyskać tylko wartość (bez nazw atrybutów), użyj
string()
:string(//Parent[@id='1']/Children/child/@name)
Funkcja fn: string () zwróci wartość swojego argumentu jako
xs:string
. Jeśli jego argumentem jest atrybut, zwróci zatem wartość atrybutu jakoxs:string
.źródło
xqilla
tym trzeba było zadzwonićxs:string
. Zastanawiam się dlaczego.xs
jest to przedrostek przestrzeni nazw dla funkcji XPath. Więc nie mieszają się z innymi.Powinieneś użyć
//Parent[@id='1']/Children/child/data(@name)
Atrybuty nie mogą być serializowane, więc nie można ich zwrócić w wyniku wyglądającym na xml. To, co musisz zrobić, to uzyskać dane z atrybutu za pomocą funkcji data ().
źródło
Jak odpowiedziano powyżej:
wyświetli tylko
name
atrybut 4child
węzłów należących doParent
określonego przez predykat[@id=1]
. Następnie musisz zmienić predykat,[@id=2]
aby uzyskać zestawchild
węzłów na następnyParent
.Jeśli jednak
Parent
całkowicie zignorujesz węzeł i użyjesz:możesz wybrać
name
atrybut wszystkichchild
węzłów za jednym razem.źródło
Tak jest w przypadku, gdy element ma atrybut 2, a jeden atrybut możemy uzyskać za pomocą innego.
źródło
@ryenus, musisz przejrzeć wynik. Tak zrobiłbym to w vbscript;
źródło
dla wszystkich xml z przestrzenią nazw użyj local-name ()
źródło