6

使用 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] 元素,但我不想要 book 的任何子元素,例如 [publisher]。我如何以正统和高效的方式完成此任务?

相关问题:有时我可能想要获取一些子元素,而不是其他子元素,例如获取所有书籍元素及其出版商子元素,但不获取其他子元素。

谢谢。

4

4 回答 4

5

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

for $b in /library/books/book
return <book title="{$b/@title}"/>
于 2011-10-21T23:13:11.867 回答
2

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

for $i in doc()//book
return <book>{
    for $a in $i/@*
    return $a
}</book>
于 2011-10-21T19:18:54.123 回答
1

我认为 Michael Kay 的一个更好的解决方案是不枚举每个所需的属性并使其更通用。需要注意的是,它/@返回一个属性而不仅仅是文本。

例如:

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

或者更一般地说:

for $book in /library/books/book return element book {$book/@*}
于 2011-11-21T23:56:45.520 回答
0

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

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

于 2011-10-21T18:41:31.337 回答