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