Problem polega na tym, że wiem, jak uzyskać dostęp do określonego węzła, ale nie mam pojęcia, jak uzyskać dostęp do węzła, jeśli rodzeństwo ma określoną wartość. Czy może to być coś takiego / a / cc / zawiera (/ a / bb = 'zz')?
HOE SENGKIANG
Odpowiedzi:
100
Nie jesteś pewien, dlaczego wszyscy pytają o rodzeństwo, możesz również sprawdzić <bb/>-elementy pasujące do predykatu z <a/>predykatu:
@HOESENGKIANG: należy kliknąć znacznik wyboru, aby „zaakceptować” tę odpowiedź, lub taką, która Twoim zdaniem najlepiej odpowiada na pytanie.
LarsH
23
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':
Nie jestem pewien, co masz na myśli, mówiąc „tylko„ osie XPath ”dla podążającego i poprzedzającego rodzeństwa”. Czy masz na myśli fakt, że nie ma jednej osi dla całego rodzeństwa?
LarsH
@LarsH: Tak, przepraszam, (przepraszam za mój zły angielski :-() - to właśnie chciałem powiedzieć (ponieważ pytanie było dla rodzeństwa)
hr_117
6
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.
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.
Odpowiedzi:
Nie jesteś pewien, dlaczego wszyscy pytają o rodzeństwo, możesz również sprawdzić
<bb/>
-elementy pasujące do predykatu z<a/>
predykatu:źródło
*-sibling
osi. Jednak +1.Potrzebujesz
following-sibling
osi XPathPrzetestuj Xpath tutaj: http://www.xpathtester.com/obj/b55ec3ac-dfa4-4f44-81e8-f963ea4a0625
źródło
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 dzieckobb
z wartością'zz'
:źródło
//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ć:
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
Proszę spojrzeć na specyfikację , zawiera kilka bardzo czytelnych przykładów, z których wiele się nauczysz.
źródło
// 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.
Źródła: http://www.w3schools.com/xsl/xpath_syntax.asp
źródło
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 tegobb
za pomocą..
, teraz, gdy możemy uzyskać dostęp docc
tak zwracanego tekstu.Mam nadzieję, że to wyjaśnienie nie jest skomplikowane.
źródło