Название этого вопроса:
выражение XPath для выбора всех узлов с общим атрибутом
Однако нигде не текст вопроса обсудить, как Тхо найти все узлы которые имеют общий атрибут, поэтому заголовок может быть неправильным.
Чтобы найти все узлы, которые имеют общий атрибут с именем x
(BTV, только элемент-узлы могут иметь атрибуты), использование:
//*[@x]
Используйте:
//@x
, чтобы выбрать все атрибуты с именем x
в документе XML. Это, вероятно, самое короткое выражение для этого.
Там нет ничего плохого в:
//*/@x
за исключением того, что она немного длиннее.
Это сокращение для:
/descendant-or-self::node()/child::*/attribute::x
, а также выбирает все x
атрибуты в документе XML.
Кому-то может показаться, что это выражение не выбирает атрибут x
верхнего элемента документа. Это неправильное заключение, так как первый шаг местоположение:
/descendant-or-self::node()
выбирает каждый узел в документе, в том числе корня (/
) сам.
Это означает, что:
/descendant-or-self::node()/child::*
выбирает каждый элемент, включая верхний элемент (который является единственным потомком корневого узла в хорошо сформированный документ XML).
Так что, когда последний шаг /@x
место, наконец, добавил, это будет выбрать все x
атрибуты всех выбранных узлов до сих пор первые два шага расположения - то есть все x
атрибуты всех элементов-узлов в XML документ.
Хороший вопрос, +1.См. Мой ответ за небольшую коррекцию утверждения Алехандро о том, что ваше выражение XPath является «неправильным». Ответ Алехандро хороший, за исключением того, что в этом выражении XPath нет ничего плохого. –