A B

XPath 1.0: список различных значений с количеством их вхождений

424 просмотра

1 ответ

Я создаю отчет, который извлекает информацию из файла 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, в противном случае я бы использовал функцию Different-values ​​(). Следующее, что я хотел бы сделать, это вернуть счетчик для каждого из устройств, перечисленных в первом выражении XPath. Например, приведенный выше XML даст мне следующие значения:

A: 3
B: 2
C: 2

Можно ли вернуть оба имени и считать в одном выражении? Если нет, то есть ли выражение XPath, которое будет возвращать только количество для каждого отдельного устройства. Я никогда не узнаю, сколько разных устройств в отчете или какие значения для элемента Device. Поэтому я не могу просто написать функции count () для определенного имени устройства.

Заранее спасибо!

Автор: Matt Furr Источник Размещён: 30.09.2019 04:01

Ответы (1)


1 плюс

Если вы ограничены XPath 1.0, это невозможно с одним запросом. Вам понадобится двухпроходный процесс. Если вы программно делаете эти запросы, используйте соответствующий язык программирования (XSLT, PHP, JavaScript), чтобы инициировать подсчет запросов на основе результатов первого запроса.

count(/JoinedRoot/FlexoPlateReport/Device[.='A'])
Автор: Thomas W Размещён: 22.07.2017 05:42
Вопросы из категории :
32x32