Получение местоположения XML-документа в XQuery - PullRequest
2 голосов
/ 03 августа 2009

Я использую Oxygen XML для работы с XML-файлом, который содержит ссылки на другие XML-файлы. Эти другие файлы XML хранятся в подкаталоге каталога, в котором находится основной файл XML.

Downloads/
directory1/
  main.xml
  subdirectory1/
    other1.xml
    other2.xml

Расположение других XML-файлов хранится в виде относительных ссылок в основном файле. Мой запрос выглядит примерно так:

for $df in /clldata/DiscussionForums/DiscussionForum
    let $href := replace(data($df/@href),"\\","/")
    for $p in doc($href)
return $p

Проблема, с которой я столкнулся, заключается в том, что Oxygen использует путь к файлу xquery в качестве основы для относительного пути, что, очевидно, приводит к ошибкам файла не найдены. Как я могу получить путь к документу XML в моем запросе?

Сейчас я просто использую concat () для указания правильного пути, но я хочу, чтобы его можно было легко использовать повторно.

Ответы [ 2 ]

2 голосов
/ 04 августа 2009

Вам необходимо разрешить URI относительно URI основного XML-документа. В вашем случае вы, вероятно, хотите сделать что-то вроде:

let $href = resolve-uri($d/@href, base-uri($d))

Здесь функция base-uri ($ d) получает абсолютный URI исходного документа, содержащего соответствующий узел DiscussionForum, а resol-uri разрешает новый URI относительно этого.

Это работает для меня, используя SAXON в плагине XQuery jedit. YMMV, я никогда не использовал Oxygen XML.

0 голосов
/ 24 апреля 2019

Я думаю, что следующее выражение XPath должно выбрать все связанные документы:

/clldata/DiscussionForums/DiscussionForum/@href/doc(resolve-uri(., base-uri(.))

Таким образом, вы сможете развернуть любой элемент xml по всем найденным документам, например так:

/clldata/DiscussionForums/DiscussionForum/@href/doc(resolve-uri(., base-uri(.))
/path/to/the/element/you/want/to/find/in/all/documents/@name

Если вы предпочитаете выражения стиля FLOWR, то что-то вроде этого должно сделать это:

for $doc in /clldata/DiscussionForums/DiscussionForum/@href/doc(resolve-uri(., base-uri(.))
where $doc/some/criteria='select'
return $doc/path/to/the/element/you/want/to/find/in/all/documents/@name
...