【问题标题】:XPath 1.0: List distinct values with number of their occurrencesXPath 1.0:列出不同值及其出现次数
【发布时间】:2017-12-28 01:50:16
【问题描述】:

我正在生成一个从 XML 文件中提取信息的报告。

<?xml version="1.0" encoding="UTF-8"?>
<JoinedRoot>
    <FlexoPlateReport>
        <Device>A</Device>
    </FlexoPlateReport>
    <FlexoPlateReport>
        <Device>B</Device>
    </FlexoPlateReport>
    <FlexoPlateReport>
        <Device>A</Device>
    </FlexoPlateReport>
    <FlexoPlateReport>
        <Device>C</Device>
    </FlexoPlateReport>
    <FlexoPlateReport>
        <Device>C</Device>
    </FlexoPlateReport>
    <FlexoPlateReport>
        <Device>B</Device>
    </FlexoPlateReport>
    <FlexoPlateReport>
        <Device>A</Device>
    </FlexoPlateReport>
</JoinedRoot>

基本上,到目前为止,我所做的是将列出不同设备的 XPath 表达式放在一起。上面的 XML 中有三个设备(A、B 和 C)。下面是 XPath 表达式。

/JoinedRoot/FlexoPlateReport[not( Device/text()=preceding-sibling::FlexoPlateReport/Device/text())]/Device/text()

我仅限于 XPath 1.0,否则我会使用 distinct-values() 函数。接下来我想做的是返回第一个 XPath 表达式中列出的每个设备的计数。例如,上面的 XML 会给我以下计数:

答:3
乙:2
C: 2

是否可以在一个表达式中同时返回名称和计数?如果没有,是否有一个 XPath 表达式将只返回每个不同设备的计数。我永远不会知道报告中有多少不同的设备或设备元素的值是什么。因此,我不能简单地为特定设备名称编写 count() 函数。

提前致谢!

【问题讨论】:

  • 您在什么环境中运行此 XPath 1.0?
  • @ThomasW,我将在 Esko 的自动化引擎中将其用作 SmartName。
  • 我只快速浏览了文档,但在我看来您可以使用 Script SmartName。不确定 Esko 的 JavaScript 引擎是否支持 XPath 查询,但您始终可以使用 JavaScript 本身迭代文档。

标签: xml xpath count distinct-values xpath-1.0


【解决方案1】:

如果您被限制在 XPath 1.0 中,那么使用单个查询是不可能的。你需要一个两遍的过程。如果您以编程方式进行这些查询,请使用相应的编程语言(XSLT、PHP、JavaScript)根据第一个查询的结果触发计数查询。

count(/JoinedRoot/FlexoPlateReport/Device[.='A'])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多