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
xpath子foo出现在子栏之前的所有节点 果 消耗品 苹果 香蕉 咖啡 机场 SFO 旧金山 LHR 伦敦_Xpath - Fatal编程技术网

xpath子foo出现在子栏之前的所有节点 果 消耗品 苹果 香蕉 咖啡 机场 SFO 旧金山 LHR 伦敦

xpath子foo出现在子栏之前的所有节点 果 消耗品 苹果 香蕉 咖啡 机场 SFO 旧金山 LHR 伦敦,xpath,Xpath,匹配第一个之前出现的所有节点。上面的第一个列表不匹配;第二种可能是 我可以假定至少有一个。而且它可能是唯一的孩子 (XPath/XSLT1.0)啊,我明白了。不要向前看查看标签,当到达项目时停止。改为转到第一个项目,并使用前面的同级向后看 <list> <head>Fruit</head> <type>Consumables</type> <item>Apple</item> &l

匹配第一个
之前出现
的所有
节点。上面的第一个列表不匹配;第二种可能是

我可以假定至少有一个
。而且它可能是唯一的孩子


(XPath/XSLT1.0)

啊,我明白了。不要向前看查看
标签,当到达
项目时停止。改为转到第一个
项目
,并使用前面的同级
向后看

<list>
    <head>Fruit</head>
    <type>Consumables</type>
    <item>Apple</item>
    <item>Banana</item>
    <item>Coffee</item>
<list>
<list>
    <head>Airports</head>
    <label>SFO</label>
    <item>San Francisco</item>
    <label>LHR</label>
    <item>London</item>
<list>
使用

match="list[item[1]/preceding-sibling::label]"

这可能比使用反向轴更有效,因为评估在
列表
的第一个找到的子项处停止,该子项是
标签

+1。我是xpath爱好者,我无法完全理解您的答案:(.如果你能提供一个简短的解释,那将对我非常有帮助。谢谢!这样更好。现在我看到了自轴的用法。+1,Q回答。@VamanKulkarni:这将选择顶部元素的任何
列表
子元素,它有一个子元素,即该
列表的第一个
标签
子元素,并且这也是
标签
。因此,您不需要遍历所有子项并在靠近末尾的某个位置找到第一个
,然后一直往回遍历并找到或不找到
标签
。此XPath表达式的计算只需要遍历一次子项,而不需要向后遍历。@VamanKulkarni:为了更好呃,理解为什么这个XPath表达式比另一个答案中的表达式更有效,假设XML文档很大,不能保存在内存中——那么这个表达式可以在流模式下进行计算——只需对文档的节点进行一次传递。但是,另一个XPath表达式需要两次传递(向前和向后)要在文档的节点上进行,而这不能在流模式下进行。@DimitreNovatchev感谢您的解释。我所困惑的部分是,这个表达式如何确保它只匹配在第一个
项之前有
标签的
元素?想象一下另一个
列表
作为子元素,只有一个
标签
。此xpath还将匹配该
列表
元素。
 /*/list[*[self::label or self::item][1][self::label]]