XPath: Почему /document-node() соответствует узлу документа?
XPath выражение /
возвращает узел документа.
XPath выражение /html
эквивалентно /child::html
и данный документ HTML вернет элемент html. Это, конечно, оценивается переходом на узел документа (обозначенный /
) и затем найти дочерний элемент, который является HTML-тегом.
Почему тогда /document-node()
на самом деле вернуть документ узла?
Учитывая общие правила выражения XPath, я бы предположил, /document-node()
эквивалентно /child::document-node()
, а также /child::document-node()
должен возвращать пустую последовательность узлов (поскольку узел документа никогда не является дочерним по отношению к узлу документа). по факту /child::document-node()
возвращает пустую последовательность узлов, что заставляет меня поверить, что /document-node()
не эквивалентно /child::document-node()
, Кажется, это нарушает общие правила выражения XPath, где пустая ось является подразумеваемой дочерней осью 1.
Есть ли какое-то специальное правило, такое, что когда у вас есть шаг document-node()
ось считается self
вместо child
? Я использую последнюю версию Altova XMLSpy (2018 sp1). Или это ошибка в XMLSpy? Или какая-то часть моего понимания общих правил выражения XPath неверна?
Примечание. Для тех, кто испытывает это, поддерживается только XPath 2 и XPath 3 document-node()
,
1 Обновление: Как несвязанный FYI, я узнал что-то новое из ответа Мэдса Хансена: в XPath 2 и XPath 3 пустая ось является подразумеваемой дочерней осью, если только нет проверки атрибута; если есть проверка атрибута, это фактически подразумеваемая ось атрибута. Так что пока /html
неявно /child::html
, /attribute()
неявно /attribute::attribute()
,
1 ответ
Это похоже на ошибку в XML Spy.
- Если имя оси опущено в шаге оси, ось по умолчанию
child
с двумя исключениями: если NodeTest на шаге оси содержит AttributeTest или SchemaAttributeTest, то осью по умолчанию являетсяattribute
; если NodeTest в шаге оси является NamespaceNodeTest, то возникает статическая ошибка [err:XQST0134] .
Проверка с помощью Saxon 9.8.0.8 (HE, PE, EE) и MarkLogic 9.0.3, XPath /document-node()
а также /child::document-node()
не выбирай ничего.
Эти XPath с разными именами осей выбирают document-node()
:
/self::document-node()
/ancestor-or-self::document-node()
/*/ancestor::document-node()
/*/ancestor-or-self::document-node()