如何获得子元素,但没有孩子?

时间:2011-10-21 18:36:00

标签: xpath xquery marklogic

使用MarkLogic但这可能是一个通用的XQuery问题。

我有:

<library>
  <books>
    <book title="whatever">
      <publisher>Random</publisher>
      ....more children
    </book>
    <book title="another">
      <publisher>Simon</publisher>
      ....more children
    </book>
    ...
  </books>
</library>

我想要返回所有[book]元素及其标题属性,但我不想要任何书籍的孩子,例如[发布]。我如何以正统和高效的方式实现这一目标?

相关问题:有时我可能希望某些的孩子,而不是其他人,例如获取所有书籍元素及其发布者子元素,但没有其他孩子。

感谢。

4 个答案:

答案 0 :(得分:4)

XQuery(实际上是一个XPath,它是XQuery的一个子集)/library/books/book在技术上做你想要的 - 它返回一组书元素,而不是别的。某些API将返回对书籍元素的引用,并让您决定要对它们执行的操作,例如显示其标题。但是,许多工具和API会将这些书籍元素与根据本书的整个子树一起复制,而在数据库的情况下,这通常是通过网络从服务器传输到客户端的结果。在这种情况下,您不希望选择现有的书籍元素,而是希望构建包含书籍元素中信息子集的新文档。为此,您可以在XQuery中使用元素构造函数:

for $b in /library/books/book
return <book title="{$b/@title}"/>

答案 1 :(得分:1)

可能有更简单的方法......但我认为像这样的东西会复制其他孩子的属性。警告:代码未经测试

for $i in doc()//book
return <book>{
    for $a in $i/@*
    return $a
}</book>

答案 2 :(得分:0)

在下面的链接中查看XQuery select语法。选择语法通常允许您获取您感兴趣的数据元素,根据需要对其进行格式化,并省略您不关心的内容。

http://www.w3schools.com/xquery/xquery_select.asp

答案 3 :(得分:0)

我认为迈克尔凯的一个稍微好一点的解决方案就是不要枚举每个所需的属性,并使其更加通用。需要注意的是/@返回一个属性而不仅仅是文本。

例如:

for $book in /library/books/book return <book>{$book/@*}</book>

甚至更普遍:

for $book in /library/books/book return element book {$book/@*}