<XXX>
<SHORT-NAME>ELEMENT1</SHORT-NAME>
<YYY>
<ZZZ>
<SHORT-NAME>ELEMENT2</SHORT-NAME>
<AAA>
<BBB>
<SHORT-NAME>ELEMENT3</SHORT-NAME>
<CCC></CCC>
<DDD></DDD>
<EEE></EEE>
<FFF>
<SHORT-NAME>ELEMENT4</SHORT-NAME>
</FFF>
<GGG>
<SHORT-NAME>ELEMENT6</SHORT-NAME>
</GGG>
</BBB>
<HHH>
<SHORT-NAME>ELEMENT5</SHORT-NAME>
</HHH>
</AAA>
</ZZZ>
</YYY>
</XXX>
这个想法是ELEMENT各自代表一个包或容器,每个子元素代表它的父元素的子元素或包。包根据其SHORT-NAME命名。元素及其子包之间可以有任意数量的元素。这个XML文件提供给我,我没有输入更改它,因为这个布局定义得很好。
“其他人”处理上述XML中的各种元素的方式基于它们相对于其父级的位置,并由其SHORT-NAME解决。例如,在上面的示例中,/ELEMENT1/ELEMENT2/ELEMENT3/ELEMENT4
是基于它的SHORT-NAME来解决<FFF>
元素的有效方法。另一方面,像/ELEMENT1/ELEMENT2/ELEMENT4
这样的东西不是解决ELEMENT4的有效方法,因为ELEMENT4在技术上是ELEMENT3的“孩子”。
所以我昨天发布了一个问题,关于如何使用XPath根据他们的SHORT-NAME检索某些元素,并且提出的解决方案是这样的:
//*[SHORT-NAME='ELEMENT1']//*[SHORT-NAME='ELEMENT2']//*[SHORT-NAME='ELEMENT3']//*[SHORT-NAME='ELEMENT4']
这可以在上面的例子中使用,但是这样做是因为我使用了像这样的XPath:
//*[SHORT-NAME='ELEMENT1']//*[SHORT-NAME='ELEMENT2']//[SHORT-NAME='ELEMENT4']
它仍会检索ELEMENT4,而实际上如果有人不知道他们需要的元素的确切路径/ heiarchy,它们应该无法检索它。这是一个关键点。
我希望这可以通过XPath查询来解决。
答案 0 :(得分:1)
您可以尝试使用以下内容:
//*[SHORT-NAME='ELEMENT1']//*[SHORT-NAME='ELEMENT2']//*[SHORT-NAME='ELEMENT3']//*[SHORT-NAME='ELEMENT4' and count(./ancestor-or-self::*[./SHORT-NAME])=4]
我们的想法是手动指定路径中提到的节点数(在提供的示例中为"4"
)。只有在路径中提到了SHORT-NAME
个孩子的所有祖先时,表达式才会返回所需的节点,所以
//*[SHORT-NAME='ELEMENT1']//*[SHORT-NAME='ELEMENT2']//*[SHORT-NAME='ELEMENT4' and count(./ancestor-or-self::*[./SHORT-NAME])=3]
不应该返回您所需的节点