Having the following XML:
<node>Text1<subnode/>text2</node>
How do I select either the first or the second text node via XPath?
Something like this:
/node/text()[2]
of course doesn't work because it's the merged result of every text inside the node.
/node/text()[2]
[...] doesn't work because it's the merged result of every text inside the node That's wrong: it means second text node child of node
root element. The string value (concatenation of descendant text nodes) would be string(/node)
Having the following XML:
Use:
/node/text()
This selects all text-node children of the top element (named "node") of the XML document.
/node/text()[1]
This selects the first text-node child of the top element (named "node") of the XML document.
/node/text()[2]
This selects the second text-node child of the top element (named "node") of the XML document.
/node/text()[someInteger]
This selects the someInteger-th text-node child of the top element (named "node") of the XML document. It is equivalent to the following XPath expression:
/node/text()[position() = someInteger]
your xpath should work . i have tested your xpath and mine in both MarkLogic and Zorba Xquery/ Xpath implementation.
Both should work.
/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
Success story sharing
//*[text()]
anyway./html/text()
does not work./html/text()
doesn't select all text nodes in the document -- only the text nodes that are children (not descendents) of the top,html
element. You probably want/html//text()
. Some knowledge and understanding of XPath is typically required in order to construct XPath expressions.