Mam następujący dokument:
<a>
<bb>abc</bb>
<cc>ccc</cc>
<dd>ddd</dd>
</a>
<a>
<bb>zz</bb>
<cc>1</cc>
<dd>2</dd>
</a>
Jak mogę uzyskać korzyści z <cc>
używania XPath, jeśli tak <bb>
jest zz
?
Mam następujący dokument:
<a>
<bb>abc</bb>
<cc>ccc</cc>
<dd>ddd</dd>
</a>
<a>
<bb>zz</bb>
<cc>1</cc>
<dd>2</dd>
</a>
Jak mogę uzyskać korzyści z <cc>
używania XPath, jeśli tak <bb>
jest zz
?
Odpowiedzi:
Nie jesteś pewien, dlaczego wszyscy pytają o rodzeństwo, możesz również sprawdzić <bb/>
-elementy pasujące do predykatu z <a/>
predykatu:
//a[bb/text() = "zz"]/cc/text()
*-sibling
osi. Jednak +1.
Potrzebujesz following-sibling
osi XPath
//a/bb[text()="zz"]/following-sibling::cc[1]/text()
Przetestuj Xpath tutaj: http://www.xpathtester.com/obj/b55ec3ac-dfa4-4f44-81e8-f963ea4a0625
P: Jak wybrać węzeł za pomocą XPath, jeśli węzeł siostrzany ma określoną wartość?
Ponieważ istnieją tylko „osie XPath” dla następującego rodzeństwa i poprzedniego rodzeństwa, możesz użyć jednego z nich, jeśli pozycja jest ustalona.
Ale lepiej:
poszukaj cc
, czy rodzic ma dziecko bb
z wartością 'zz'
:
//cc[../bb='zz']
//a[bb = 'zz']/cc
.
Po pierwsze, twój przykład nie jest dobrze sformułowanym XML. Pomijając to i że nie opisałeś zbyt dobrze swoich zamiarów (co dokładnie chcesz wybrać, pod jakim warunkiem?), Zakładam, że chcesz to zrobić:
//cc[preceding-sibling::bb[text()="zz"]]/text()
To wybiera
TEXT VALUES OF ALL <CC> ELEMENTS
//cc /text()
THAT HAVE A PRECEDING SIBLING <BB>
[preceding-sibling::bb ]
THAT HAS TEXT VALUE EQUAL TO "zz"
[text()="zz"]
Możesz również napisać jako
//bb[text()="zz"]/following-sibling::cc/text()
Proszę spojrzeć na specyfikację , zawiera kilka bardzo czytelnych przykładów, z których wiele się nauczysz.
//a/cc[../bb='zz']/text()
// a: wybiera wszystkie elementy „a” bez względu na to, gdzie się znajdują.
// a / cc: wybiera elementy „cc”, które są dziećmi elementu „a” (bez względu na to, gdzie jest).
..: Wybiera rodzica bieżącego węzła.
[../bb='zz ']: gdzie wartość siostrzanego elementu „bb” to zz.
Innym rozwiązaniem tego problemu jest
//bb[contains(.,'zz')]/../cc/text()
Objaśnienie : Każdy, bb
który zawiera 'zz'
ciąg we wszystkich węzłach potomnych, bb
a następnie przechodzi do węzła nadrzędnego tego bb
za pomocą ..
, teraz, gdy możemy uzyskać dostęp do cc
tak zwracanego tekstu.
Mam nadzieję, że to wyjaśnienie nie jest skomplikowane.