我正在练习编写一些 XPath 查询,并被困在一个特定的问题上。以下是我正在使用的示例文档:

<dept-db>
  <dept>
    <name>HR</name>
      <emp>
        <name>John</name>
        <country>USA</country>
      </emp>
      <emp>
        <name>Chris</name>
        <country>USA</country>
      </emp>
  </dept>
  <dept>
    <name>Technology</name>
    <emp>
      <name>Oliver</name>
      <country>UK</country>
    </emp>
    <emp>
      <name>Emily</name>
      <country>USA</country>
    </emp>
  </dept>
</dept-db>

我想要实现的是检索所有在文档中出现两次以上国家/地区的员工。我从一个更简单的查询开始,即应该找到重复项的查询:
<!-- language: lang-xsl -->
doc("emp.xml")//emp[preceding::emp/country=./country or following::emp/country=./country]

虽然它返回所有员工(显然 Oliver 不应该列在结果中)。

我是 XPath 的新手,不太确定我是否理解了点 '.' 的概念。正确的说明符。我希望上述查询的行为是这样的:遍历 emp 节点集,并为每次检查在文档中出现在当前节点上方和下方的节点中是否存在具有相同国家/地区的员工。

我会感谢解释(应用点说明符来执行 GROUP BY 类型的查询)并帮助使查询工作(除非不可能使用单个路径表达式?)。如果重要的话,我使用 eXide(eXist-db 2.1 的一部分)和 XQuery 3.0 来执行查询。

最佳答案

在 XPath 2.0 中,你可以做

//emp[count(index-of(//country/text(), country/text())) > 2]
index-of 将指示整个文档中 country/text() 出现的索引,然后我们需要做的就是对它们进行计数并检查是否超过 2。

关于XPath:使用单个路径表达式查询查找重复 n 次的节点,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21665032/

10-12 12:33
查看更多