Mając następujący XML:
<node>Text1<subnode/>text2</node>
Jak wybrać pierwszy lub drugi węzeł tekstowy za pośrednictwem XPath?
Coś takiego:
/node/text()[2]
oczywiście nie działa, ponieważ jest to scalony wynik każdego tekstu wewnątrz węzła.
Mając następujący XML:
<node>Text1<subnode/>text2</node>
Jak wybrać pierwszy lub drugi węzeł tekstowy za pośrednictwem XPath?
Coś takiego:
/node/text()[2]
oczywiście nie działa, ponieważ jest to scalony wynik każdego tekstu wewnątrz węzła.
Odpowiedzi:
Mając następujący XML:
<node>Text1<subnode/>text2</node>
Jak wybrać pierwszy lub drugi węzeł tekstowy za pośrednictwem XPath?
Zastosowanie :
/node/text()
Powoduje to zaznaczenie wszystkich elementów potomnych węzła tekstowego najwyższego elementu (o nazwie „węzeł”) dokumentu XML.
/node/text()[1]
Powoduje to zaznaczenie pierwszego elementu podrzędnego węzła tekstowego najwyższego elementu (o nazwie „węzeł”) dokumentu XML.
/node/text()[2]
Spowoduje to wybranie drugiego podrzędnego węzła tekstowego najwyższego elementu (zwanego „węzłem”) dokumentu XML.
/node/text()[someInteger]
Spowoduje to wybranie someInteger-th węzła tekstowego elementu podrzędnego najwyższego elementu (o nazwie „węzeł”) dokumentu XML. Jest równoważne z następującym wyrażeniem XPath:
/node/text()[position() = someInteger]
/node[2]
nie może wybierać żadnego węzła, jeśli źródłowy dokument XML jest poprawnie sformułowany. Z definicji w dobrze sformułowanym dokumencie XML jest tylko jeden (pojedynczy) górny element - znany również jakodocument-element
//*[text()]
mimo wszystko. /html/text()
nie działa.
/html/text()
nie zaznacza wszystkich węzłów tekstowych w dokumencie - tylko węzły tekstowe, które są dziećmi (nie potomkami) górnego html
elementu. Prawdopodobnie chcesz /html//text()
. Do konstruowania wyrażeń XPath jest zwykle wymagana pewna znajomość i zrozumienie języka XPath.
twoja ścieżka xpath powinna działać. Przetestowałem twoją i moją xpath w implementacji MarkLogic i Zorba Xquery / Xpath.
Obie powinny działać.
/node/child::text()[1] - should return Text1
/node/child::text()[2] - should return text2
/node/text()[1] - should return Text1
/node/text()[2] - should return text2
/node/text()[2]
[...] nie działa, ponieważ jest to scalony wynik każdego tekstu wewnątrz węzła . Źle: oznacza to, że drugi węzeł tekstowy jest dzieckiemnode
elementu głównego . Wartość ciągu (konkatenacjastring(/node)