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

标签 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>


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/

相关文章:

xml - 只查找第一次出现的 XPath 表达式是什么?

python - 在Python中使用Xpath按属性选择祖先节点

c# - XSLT 转换期间 XSD 上的 XML 验证

javascript - page.xml 中的 Magento skin_js 路径

java - 使用 SAXON java 程序进行转换时,XSLT 无法找到 SQL jar 文件

objective-c - GDataXML、命名空间和 xpath

xml - 简单的前同级选择返回意外结果

xml - 当 XML 有 2 个包装器时无法读取内容

javascript - 如何在 XQuery 函数中转义 Javascript

java - 嵌套 XML 解码到 POJO 类