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()
*-siblingosi. Jednak +1.
Potrzebujesz following-siblingosi 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 bbz 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, bbktóry zawiera 'zz'ciąg we wszystkich węzłach potomnych, bba następnie przechodzi do węzła nadrzędnego tego bbza pomocą .., teraz, gdy możemy uzyskać dostęp do cctak zwracanego tekstu.
Mam nadzieję, że to wyjaśnienie nie jest skomplikowane.