Почему этот запрос XPath работает не так, как я предполагал? (поиск элементов с одним @ при исключении элементов с другим @)

У меня есть следующий запрос (XPath 2.0):

//xref[contains(@href,'#') and @class='- topic/xref ' and @type!='step' and @type!='fig' and @type!='substep']

Как видите, я хочу найти элементы темы/внешней ссылки с хешем в их атрибуте href. Я хочу исключить определенные типы элементов. Проблема в том, что приведенный выше запрос не отображает элементы с @outputclass='expandable'

Мне пришлось запустить отдельный, чтобы идентифицировать их:

//xref[contains(@href,'#') and @outputclass='expandable']

Почему первый, более длинный запрос не отображает эти элементы? Я также пробовал contains(@class='-topic/xref) вместо @class='-topic/xref', и это не помогло.


person kukunamuniu    schedule 16.06.2017    source источник
comment
Добавьте соответствующий источник XML и укажите требуемый вывод, так как ваша проблема не совсем ясна.   -  person Andersson    schedule 16.06.2017
comment
@Andersson Это огромная карта DITA с десятками тем, и я не могу ею поделиться. Вот пример того, что я хочу найти: 1. ‹xref href=2012121213534449584.dita# outputclass=expandable class=-topic/xref/› 2. ‹xref href=2012121213534449584.dita# class=-topic/xref/›   -  person kukunamuniu    schedule 16.06.2017
comment
Итак, вам нужны элементы с class="- topic/xref " и outputclass="expandable" , верно? а как насчет при исключении тех, у кого есть другие @? Что исключить?   -  person Andersson    schedule 16.06.2017
comment
Я также хочу class= '- topic/xref ', у которых нет outputclass='expandable'. На самом деле, мне нужны все class='- topic/xref', которые не имеют ничего из следующего в их @type: fig, substep, table, независимо от того, есть ли у них outputclass='expandable' или нет, но имеют символ # в их @href.   -  person kukunamuniu    schedule 16.06.2017


Ответы (2)


Попробуйте ниже XPath:

//xref[@class="- topic/xref " and contains(@href, "#") and not(@type=("fig", "substep", "table") or @outputclass="expandable")]

который вернет xref элементов с class="- topic/xref " и # в атрибуте href, но не имеет атрибута type со значениями "fig", "substep", "table" или атрибута outputclass со значением "expandable"

person Andersson    schedule 16.06.2017
comment
Мне действительно нужны расширяемые. Я изменил то, что вы отправили, и в конечном итоге использовал это: //xref[@class="- topic/xref " and contains(@href, "#") and not(@type=("fig", "substep", "table", "step"))] чтобы делать то, что мне нужно было сделать. В отличие от моего первоначального запроса, этот не пропускал из результатов те, у которых @outputclass = expandable. - person kukunamuniu; 16.06.2017

Вы не показали свой источник XML, но я подозреваю, что вы ожидали получить элементы, не имеющие атрибута @type. Однако условие @type!='XYZ' верно только для элемента, имеющего атрибут @type, значение которого отличается от 'XYZ'. Если мое предположение верно, вы имели в виду not(@type='XYZ').

person Michael Kay    schedule 16.06.2017
comment
Спасибо за объяснение !=! В моем случае я не хочу полностью опускать атрибут @type; это огромный набор файлов, который существует уже много лет и имеет много соавторов, и он содержит удивительные вещи в элементах. В сочетании с ответом @Andersson я получил запрос, который сделал то, что мне было нужно сегодня. - person kukunamuniu; 16.06.2017