Выберите комментарий () перед корневым узлом

Это отвлечение превратилось в навязчивую идею. Я возился с eXist и решил получить comment() из документа. Единственная проблема в том, что большинство наших комментариев идут перед корневым узлом. Возьмем пример

XML

<?xml version="1.0" encoding="UTF-8"?>
<!-- DOCUMENT REVIEWED -->
<doc id="test">
  <figure>
    <figcaption>caption</figcaption>
  </figure>
  <p>blah blah blah</p>
</doc>

XQUERY

xquery version "3.1";
let $col := '/db/project/data'

let $result := <docs> { 
    for $doc in collection($col)/doc
       let $id := string($doc/@id)
       let $figures := count($doc//figures)
       let $comments := ????? 
       return <doc id="{$id}" figurecount="{$figures}">{$comments}</doc>

} </docs>
return $result

Теперь я пробовал несколько вещей. ancestor::comment(), preceding-sibling, даже collection($col)//comment(). Я могу найти комментарий перед <doc> в oXygen, просто //comment() помогает.

Мне это действительно не нужно для чего-то конкретного, но меня беспокоит, что я не могу понять это.


person matchew    schedule 06.05.2015    source источник
comment
Какая версия eXist? Объявление версии 3.1 предполагает, что это относительно недавняя сборка из исходной ветки разработки.   -  person Joe Wicentowski    schedule 07.05.2015
comment
Кроме того, как вы выполняете этот запрос в eXist? Используете eXide?   -  person Joe Wicentowski    schedule 07.05.2015
comment
Я могу подтвердить неожиданные результаты в текущей ветке разработки eXist. Я зарегистрировал проблему на трекере eXist: github.com/eXist-db/exist/ вопросы/623.   -  person Joe Wicentowski    schedule 07.05.2015
comment
Привет @joewiz, обычно я использую restxq, но в данном случае да, eXide. Кроме того, это из ветки разработки. Я последний раз обновлял его на прошлой неделе, я думаю.   -  person matchew    schedule 07.05.2015
comment
Я постараюсь обновлять эту тему, сообщая о любых действиях, предпринятых для решения этой проблемы, но вы также можете подписаться на эту проблему, если у вас есть учетная запись github, поэтому вы будете немедленно уведомлены, если проблема будет обновлена. Спасибо за отчет.   -  person Joe Wicentowski    schedule 08.05.2015
comment
@joewiz Спасибо. Github — лучшее место для меня. Кроме того, я также обычно довольно внимательно слежу за списком рассылки, хотя и не участвую.   -  person matchew    schedule 08.05.2015


Ответы (1)


Комментарий не является потомком документа <doc>; это дочерний узел документа, который предшествует <doc>, поэтому preceding-sibling::comment() должен был работать.

Например, вот как ваш документ будет создан с нуля:

document {(
  <!-- DOCUMENT REVIEWED -->,
  <doc id="test">
    <figure>
      <figcaption>caption</figcaption>
    </figure>
    <p>blah blah blah</p>
  </doc>
)}

Таким образом, вы можете выбрать его, начав с узла документа:

doc('my-doc.xml')/comment()

Или вы можете выбрать его предыдущего брата, если контекст <doc>:

doc('my-doc.xml')/doc/preceding-sibling::comment()

Я думаю, что в eXist collection() должен возвращать узел документа, чтобы вы могли перебирать его напрямую, вместо того, чтобы выбирать корневой элемент:

for $doc-node in collection($col)
let $comment := $doc-node/comment()
let $id := $doc-node/doc/@id
let $figures := count($doc//figures)
return ...
person wst    schedule 06.05.2015
comment
видите, я тоже так думал, но это не работает. Вот почему я спрашиваю. Спасибо за попытку +1. Мне интересно, если это проблема eXist сейчас. Может быть, мне следует обратиться к их списку рассылки. - person matchew; 06.05.2015
comment
Я запустил ваш код в BaseX, используя let $comments := $doc/preceding-sibling::comment(), и он работал нормально. Таким образом, это действительно может быть связано с eXist. - person bjimba; 06.05.2015
comment
@matchew Это может быть ошибка в eXist. Это кажется маловероятным, учитывая, что это (я думаю) хорошо определено в спецификации. Но я также запускал его в MarkLogic, и у меня не было такой проблемы. Публикация в их списке - хорошая идея ... наверняка кто-то сталкивался с этим раньше. - person wst; 07.05.2015
comment
Теперь это похоже на проблему eXist (github.com/eXist-db/exist/issues /623). Я рад, что сначала задал вопрос здесь, кажется, что это может быть хороший вопрос, и я не видел его в другом месте. Спасибо! - person matchew; 07.05.2015