我得到了以下XML内容
<root>
<node1>Hi from node 1</node1>
text not encapsulated in node
<node2>Hi from node 2</node2>
<node3>content....<node3/>
</root>
问题是:如何使用XPath 1.0或2.0获取节点3之前的所有内容,即使没有封装在节点中?
/root/node3/preceding-sibling::node()
将选择所有节点,而不仅仅是元素,在node3
之前作为兄弟节点:
<node1>Hi from node 1</node1>
text not encapsulated in node
<node2>Hi from node 2</node2>
如果您确实想要所有先前同级节点的内容,请参见@DanielHaley的精彩回答,或使用以下方法(也适用于XPath 2.0):
/root/node3/preceding-sibling::node()/string()
产生:
Hi from node 1
text not encapsulated in node
Hi from node 2
使用normalize-space()
代替string()
对空格进行规范化处理:
Hi from node 1 text not encapsulated in node Hi from node 2
既然您可以使用XPath 2.0,我建议您结合使用string-join()和normalize-space()函数...
string-join(//text()[following::node3]/normalize-space(),' ')
returns...
Hi from node 1 text not encapsulated in node Hi from node 2