在根节点之前选择comment()

时间:2015-05-06 19:42:21

标签: xml xpath xquery exist-db

这是一种分心转向的痴迷。我在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()。我可以在oXygen的<doc>之前找到评论,只需//comment()即可。

我并不是真的需要这个具体的任何东西,但它让我烦恼,我无法弄明白。

1 个答案:

答案 0 :(得分:2)

评论不是<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 ...