Skip to main content
 首页 » 编程设计

xml之在根节点之前选择comment()

2025年12月25日31shangdawei

这是一种分散注意力的迷恋。我当时在搞乱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> 


X查询

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()就能完成操作。

我确实不需要任何特定的东西,但是让我烦恼的是我无法弄清楚。

请您参考如下方法:

该注释不是<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 ...