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

Osa*_*dan 3 xml xslt xpath

我得到了以下 XML 内容

<root>
   <node1>Hi from node 1</node1>
   text not encapsulated in node
   <node2>Hi from node 2</node2>
   <node3>content....<node3/>
</root>
Run Code Online (Sandbox Code Playgroud)

问题是:如何获取node3之前的所有内容,甚至那些未使用XPath版本1.0或2.0封装在节点中的内容?

kjh*_*hes 5

这个 XPath,

/root/node3/preceding-sibling::node()
Run Code Online (Sandbox Code Playgroud)

将选择所有节点,而不仅仅是元素,作为node3兄弟节点:

   <node1>Hi from node 1</node1>
   text not encapsulated in node
   <node2>Hi from node 2</node2>
Run Code Online (Sandbox Code Playgroud)

如果您确实想要所有先前同级节点的内容,请参阅@DanielHaley 的很好的答案,或使用(也可以使用 XPath 2.0):

/root/node3/preceding-sibling::node()/string()
Run Code Online (Sandbox Code Playgroud)

产量:

    Hi from node 1 
   text not encapsulated in node
    Hi from node 2
Run Code Online (Sandbox Code Playgroud)

使用normalize-space()代替string()来规范化空白:

 Hi from node 1 text not encapsulated in node Hi from node 2 
Run Code Online (Sandbox Code Playgroud)

请注意,这些返回多个字符串(可能在上下文中连接),而 Daniel Haley 的 XPath 表达式将直接返回单个字符串,这可能更直接是您想要的。