使用XPath获取特定节点之前的所有内容

3

我得到了以下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之前的所有内容,即使没有封装在节点中?
2个回答

5
这个XPath,
/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 

请注意,这些返回多个字符串(可以在上下文中拼接),而 Daniel Haley 的 XPath 表达式将直接返回一个单独的字符串,这可能更符合您的需求。

与我合作,谢谢! - Osama Abuhamdan

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 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接