Фильтр XPath по атрибуту и возвращает различные значения

#xml #xslt #xpath #xpath-1.0

#xml #xslt #xpath #xpath-1.0

Вопрос:

Из следующего мне нужно вернуть отдельный список значений с 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
  

Комментарии:

1. Я изменил закрывающие элементы с Classification на classification , чтобы сделать XML правильно сформированным.

2. Если вы используете XSLT (в отличие от просто XPath) и хотите получать разные значения, то используйте метод группировки по Мюнх-Хаусу . Обратите также внимание, что некоторые процессоры XSLT 1.0 поддерживают функцию расширения EXSLT set:distinct() .

Ответ №1:

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

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

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

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

Комментарии:

1. Это вернуло: Категория первая, Категория вторая, Категория третья Категория первая, Категория вторая, Категория третья Категория первая, Категория вторая, Категория третья Категория первая, Категория вторая, Категория третья Категория первая, Категория вторая, Категория третья Категория первая, Категория вторая, Категория третья

2. спасибо, что очень помогло. Проблема была с моим выбором строки при импорте файла.

3. @Mark, не беспокойся. Если это работает для вас, пожалуйста, примите это как ответ.

4. Обратите внимание, что preceding axe будет перемещаться по документу вверх в jerarquia.

Ответ №2:

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

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

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

Комментарии:

1. Это используется в модуле Drupal views_xml_backend и возвращает следующую ошибку «xmlXPathCompOpEval: функция distinct-значения не найдены», я полагаю, что это XPATH 1.0.

2. @Mark, приносим извинения за отсутствие xpath-1.0 тега.