XPath:选择以下所有同级,直到另一个同级
以下是我的xml摘录:XPath:选择以下所有同级,直到另一个同级,xpath,Xpath,以下是我的xml摘录: <node/> <node/> <node id="1">content</node> <node/> <node/> <node/> <node id="2">content</node> <node/> <node/> 我位于节点[@id='1']中。我需要一个Xpath来匹配所有元素,直到下一个非空节点node[@id='2'] 编辑
<node/>
<node/>
<node id="1">content</node>
<node/>
<node/>
<node/>
<node id="2">content</node>
<node/>
<node/>
我位于节点[@id='1']中。我需要一个Xpath来匹配所有元素,直到下一个非空节点node[@id='2']
编辑:
@id属性只是为了更清楚地解释我的问题,但不在原始XML中。我需要一个不使用@id属性的解决方案
我不想匹配节点[@id='2']之后的空同级,因此我不能使用简单的以下同级::节点[text=]
我如何才能做到这一点?您可以这样做:
../node[not(text()) and preceding-sibling::node[@id][1][@id='1']]
或者更简单、更高效地使用密钥:
<xsl:key
name="kNode"
match="node[not(text())]"
use="generate-id(preceding-sibling::node[@id][1])"
/>
<xsl:copy-of select="key('kNode', generate-id(node[@id='1']))" />
XPath 2.0中的运算符node1比接受的答案更简单:
//node[@id='1']/following-sibling::node[following::node[@id='2']]
在id为“1”的任何位置查找节点
现在查找以下所有同级节点元素
…但前提是这些元素后面还有一个id为2的节点。
以更清晰的测试文档和合法id值显示:
xml='1〕
所容纳之物
所容纳之物
'
使用libxml2的Ruby库;http://nokogiri.org
需要“nokogiri”;doc=Nokogiri::XMLxml
表达式=//节点[@id='c']/后续同级::节点[后续::节点[@id='g']]
放置doc.xpathexpression
=>
=>
=>
我最终选择了另一条路线,因为我在XSLT之外,所以我选择了以下所有同级节点,并对它们进行迭代,当遇到下一个非空节点时停止循环。我认为你的回答是最彻底的,因为我现在相信XPath中没有一行可以完成我的要求。@subtenate:Erm-但我的回答中有一行XPath一行可以做到这一点?!是的,你是对的,我的问题不是很清楚,我放的id属性只是为了展示和解释问题。实际上,我的XML中没有id属性。@Subtenant:这就是为什么当您想要解决实际问题时,您永远不应该编写代码示例的原因。这可能有用:另请参见:为什么在这里选择以下轴?如果文档比下一个轴大,并且比任何其他轴慢,那么这可能会进一步导致误报。
following-sibling::node[not(text()) and . << current()/following-sibling::node[@od][1]]
//node[@id='1']/following-sibling::node[following::node[@id='2']]