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.

3.3.5 Сокращенный синтаксис

  1. Если имя оси опущено в шаге оси, ось по умолчанию 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()
Другие вопросы по тегам