Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
XPath:选择以下所有同级,直到另一个同级_Xpath - Fatal编程技术网

XPath:选择以下所有同级,直到另一个同级

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'] 编辑

以下是我的xml摘录:

<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']]