2015-05-06 25 views
1

这是一个分心转向痴迷。我在eXist周围乱搞,并决定从文档中获得comment()。唯一的问题是我们的大部分评论都出现在根节点之前。让我们举个例子在根节点之前选择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()就可以了。

我并不真的需要这个具体的东西,但它的烦人,我无法弄清楚。

+0

哪个版本的eXist? 3.1版本声明表明这是来自源代码开发分支的相对较新版本。 – joewiz

+0

另外,你如何在eXist中运行这个查询?使用eXide? – joewiz

+0

我可以在eXist的当前开发分支中确认意外的结果。我在eXist的跟踪器上提交了一个问题:https://github.com/eXist-db/exist/issues/623。 – joewiz

回答

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 ... 
+0

看到我也这么认为,但它不工作。这就是为什么我问。感谢您尝试+1。我想知道如果这是一个eXist问题。也许我应该打他们的邮件列表。 – matchew

+0

我用'let $ comments:= $ doc/preceding-sibling :: comment()'在BaseX中运行了你的代码,它工作正常。所以,这可能确实是由eXist特定的。 – bjimba

+0

@matchew这可能是eXist中的一个错误。这似乎不太可能,因为这是(我认为)在规范中明确定义的。但我也在MarkLogic中运行它,并没有遇到同样的问题。张贴到他们的名单是一个好主意......肯定有人跑过这个之前。 – wst