Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xpath 如何获取子元素但不获取其子元素?_Xpath_Xquery_Marklogic - Fatal编程技术网

Xpath 如何获取子元素但不获取其子元素?

Xpath 如何获取子元素但不获取其子元素?,xpath,xquery,marklogic,Xpath,Xquery,Marklogic,使用MarkLogic,但这可能是一个通用的XQuery问题 我有: <library> <books> <book title="whatever"> <publisher>Random</publisher> ....more children </book> <book title="another"> <publisher>Sim

使用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]。我如何以正统的方式完成这项工作

相关问题:有时我可能想得到一些子元素,但不想得到其他子元素,例如,获得所有的book元素及其publisher子元素,但不获取其他子元素


谢谢。

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


可能有更简单的方法。。。但我认为类似的东西会将属性复制到其他孩子身上。警告:代码未经测试

for $i in doc()//book
return <book>{
    for $a in $i/@*
    return $a
}</book>
用于doc()中的$i//book
返回{
$i中的$a/@*
返回$a
}
XQuery(实际上是一个XPath,它是XQuery的子集)
/library/books/book
从技术上讲,它只返回一组book元素,其他什么都不返回。一些API将返回对book元素的引用,并让您决定如何处理它们,例如显示它们的标题。然而,许多工具和API会将这些book元素与以book为根的整个子树一起复制,对于数据库,这通常是通过网络从服务器传输到客户端的结果。在这种情况下,您不希望选择现有的book元素,而是希望构造一个新文档,其中包含book元素中信息的子集。为此,可以在XQuery中使用元素构造函数:

for $b in /library/books/book
return <book title="{$b/@title}"/>
在/图书馆/书籍/书籍中花费$b
返回

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

例如:

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

谢谢你,迈克尔!在我看来,这似乎是最优雅的方法,在我看过其他建议之后。谢谢,这很有帮助,因为它为我提供了一种更普遍的方法。你也不必使用它。您可以使用如下路径表达式:/library/books/book/{@*}我非常喜欢这种方法的简单性。然而,我的第一反应是,为什么你的x路径中有一个元素?我想我会采用这种方法。谢谢
for $book in /library/books/book return element book {$book/@*}