【问题标题】:MarkLogic: XQuery to Get Distinct Names from XML Document?MarkLogic:XQuery 从 XML 文档中获取不同的名称?
【发布时间】:2016-04-11 23:00:01
【问题描述】:

我正在使用以下文件:

<bookstore>
  <book category="COOKING">
    <title lang="en">Everyday Italian</title>
    <author>Giada De Laurentiis</author>
    <year>2005</year>
    <price>30.00</price>
  </book>
  <book category="CHILDREN">
    <title lang="en">Harry Potter</title>
    <author>J K. Rowling</author>
    <year>2005</year>
    <price>29.99</price>
  </book>
  <book category="WEB">
    <title lang="en">XQuery Kick Start</title>
    <author>James McGovern</author>
    <author>Per Bothner</author>
    <author>Kurt Cagle</author>
    <author>James Linn</author>
    <author>Vaidyanathan Nagarajan</author>
    <year>2003</year>
    <price>49.99</price>
  </book>
  <book category="WEB">
    <title lang="en">Learning XML</title>
    <author>Erik T. Ray</author>
    <year>2003</year>
    <price>39.95</price>
  </book>
</bookstore>

我正在使用以下查询从 XML 文档中获取名称

for $x at $i in doc("bookstore.xml")/bookstore/book/*
return fn:distinct-values(name($x))

我得到以下结果:

title
author
year
price
title
author
year
price
title
author
author
author
author
author
year
price
title
author
year
price

相反,我只想要一个不同的,如下所示。

title
author
year
price

我相信我搞砸了 for 循环。有人可以帮我解决这个问题吗?我尝试使用不同的值()。没有运气。

【问题讨论】:

    标签: xml xquery marklogic


    【解决方案1】:

    name($x) 包含当前由变量 $x 引用的元素的名称。而$x 总是一次引用一个元素,因此在name($x) 上调用distinct-values() 将没有用处。相反,您想在包含所有元素名称的集合上调用 distinct-values(),例如:

    let $result := 
        for $x at $i in doc("bookstore.xml")/bookstore/book/*
        return name($x)
    return fn:distinct-values($result)
    

    这也可以使用普通的 XPath 表达式来实现,如下所示:

    distinct-values(doc("bookstore.xml")/bookstore/book/*/name(.))
    

    【讨论】:

    • 感谢您的帮助。 Xpath 一是甜蜜而短暂的。有用。非常感谢!
    【解决方案2】:

    您在 for 循环中调用了 distinct-values(),为表达式返回的序列中的每个项目调用一次。而是将for 表达式的结果传递给distinct-values()

    fn:distinct-values(
      for $x at $i in doc("bookstore.xml")/bookstore/book/*
      return name($x)
    )
    

    附注:node-name()local-name() 通常比 name() 更推荐。当您需要元素的qualified name 时使用前者,而当您只需要字符串值时使用后者。

    【讨论】:

    • 感谢您的解释。这个解决方案也有效。谢谢。
    【解决方案3】:

    你也可以试试最简单的

    let $x := doc("bookstore.xml")/bookstore/book
    return distinct-values($x/name())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-07
      • 2011-09-16
      • 2019-04-24
      • 2011-08-18
      相关资源
      最近更新 更多