XQuery не может выбирать дочерние элементы по имени элемента, может выбирать по индексу - PullRequest
0 голосов
/ 14 января 2019

У меня есть запрос XQuery, в котором я создаю документ XHTML из данных, хранящихся в XML. XML выглядит так:

<document>
    <div>
        <head>name-I-should-display</head>
        <!-- more data -->
    </div>
    <div>
        <head>name-of-div-2</head>
        <!-- more data -->
    </div>
    <!-- more divs -->
</document>

В моем xquery я могу получить документ XML в порядке:

let $mydoc := doc("my-xml-file.xml")

Я могу получить узел «document» следующим образом:

let $rootnode := $mydoc/*[1]

но если я попробую это:

let $rootnode := $mydoc/document

Я ничего не понимаю. Когда я получаю узел «document» с первой формой, div ведут себя так же. Я очень плохо знаком с XQuery, но знаю, что это должно работать, как это уже было в другом запросе к документу с очень похожей структурой.

Дополнительная информация, которая может помочь:

  • используется программа BaseX 9.0.2 на Linux
  • Я использую функцию /name(), чтобы определить, получил ли я нужный мне узел или получил ноль
  • XML-файл в начале имеет объявление таблицы стилей XSLT, аналогичный файл, который работал таким образом, не имел ни одного
  • Я не могу изменить файл XML

Что могло пойти не так?

1 Ответ

0 голосов
/ 14 января 2019

Является ли документ XML также документом XHTML в пространстве имен XHTML? Если это так, то ваш XPath не работает, потому что он выбирает только элементы без пространства имен. Попробуйте:

let $rootnode := $mydoc/*:document

Звездочка в этом случае подстановочный знак обозначает пространство имен, но не имя элемента. Если это выбирает корень, то элемент находится в пространстве имен. Вы можете обнаружить URI пространства имен, используя это:

fn:namespace-uri-from-QName($mydoc/*/fn:node-name(.))

Затем вы можете взять это значение и присвоить его префиксу в прологе вашего XQuery (в этом примере предполагается, что выводом является пространство имен XHTML):

declare namespace xh="http://www.w3.org/1999/html";

Используя префикс, вы можете более точно выбрать нужные элементы, используя XPath:

let $rootnode := $mydoc/xh:document
...