XPath 1.0:列出具有出现次数的不同值

时间:2017-07-21 22:04:10

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

我正在生成一个从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 Expression放在一起,列出不同的设备。上面的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 B:2
C:2

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

提前致谢!

1 个答案:

答案 0 :(得分:1)

如果您被限制在XPath 1.0中,单个查询就无法做到这一点。你需要一个双程过程。如果您以编程方式进行这些查询,请使用相应的编程语言(XSLT,PHP,JavaScript)根据第一个查询的结果触发计数查询。

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