Фильтр XPath по атрибуту и ​​возвращает разные значения - PullRequest
1 голос
/ 15 марта 2019

Из следующего мне нужно вернуть отдельный список значений с атрибутом Category.

<root>
    <classifications>
        <classification name="Category">Category One</classification>
        <classification name="Sub-Category">Sub-Category One</classification>
    </classifications>
    <classifications>
        <classification name="Category">Category Two</classification>
        <classification name="Sub-Category">Sub-Category One</classification>
    </classifications>
    <classifications>
        <classification name="Category">Category One</classification>
        <classification name="Sub-Category">Sub-Category Two</classification>
    </classifications>
    <classifications>
        <classification name="Category">Category Three</classification>
        <classification name="Sub-Category">Sub-Category One</classification>
    </classifications>
    <classifications>
        <classification name="Category">Category One</classification>
        <classification name="Sub-Category">Sub-Category Two</classification>
    </classifications>
    <classifications>
        <classification name="Category">Category Two</classification>
        <classification name="Sub-Category">Sub-Category One</classification>
    </classifications>
</root>

Используя classifications/classification[@name="Category"] Я получаю:

Category One
Category Two
Category One
Category Three
Category One
Category Two

Что мне нужно, это:

Category One
Category Two
Category Three

Ответы [ 2 ]

1 голос
/ 15 марта 2019

Этот XPath выберет отдельные элементы:

//classification[@name = "Category" and not(preceding::classification = .)]

или более конкретно:

//classification[@name = "Category" 
    and not(preceding::classification[@name = "Category"] = .)
]
0 голосов
/ 15 марта 2019

Для тех, кто может использовать XPath 2.0 и выше:

Альтернативный подход, который может быть более гибким и более эффективным (по крайней мере, в Saxon 9.8.0):

distinct-values(//classification[@name = 'Category'])
...