首页 文章

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

提问于
浏览
2

我正在生成一个从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
B:2
C:2

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

提前致谢!

1 回答

  • 1

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

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

相关问题