这是一种分散注意力的迷恋。我当时在搞乱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 ...
关于xml - 在根节点之前选择comment(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30086095/