Несколько вещей, чтобы понять:
.
относится к текущему узлу (он же «контекстный узел»)
- узел атрибута имеет родителя (элемент, которому он принадлежит)
- операция объединения XPath (с
|
) никогда не дублирует узлы, т.е. (.|.)
приводит к одному узлу, а не двум
- есть ось
self::
, которую вы можете использовать в теории (например, self::*
работает, чтобы определить, является ли узел элементом), но self::@*
не работает, поэтому мы должны использовать что-то другое
Зная это, вы можете сказать:
../@*
извлекает все атрибуты родительского узла текущего узла (если хотите, все "атрибуты родного элемента")
(.|../@*)
объединяет текущий узел с ними - если текущий узел является атрибутом, общее количество не изменяется (согласно пункту 3 выше)
- поэтому, если
count(.|../@*)
равно count(../@*)
, текущий узел должен быть узлом атрибута .