你如何在XQuery 3.0中返回多个值?

Wol*_*'08 7 xml xquery xquery-3.0

我尝试过几件事:

for $name in ('Hanz', 'Heinz', 'Hans', 'Huns', 'Hund')
where $name contains text 'Hans' using fuzzy
return $name | $name
(: returns error: Stopped at line 3, column 20: [XPTY0004] 
Union expression: node() expected, xs:string found. :)


for $name in ('Hanz', 'Heinz', 'Hans', 'Huns', 'Hund')
where $name contains text 'Hans' using fuzzy
return $name and $name
(: returns true :)

for $name in ('Hanz', 'Heinz', 'Hans', 'Huns', 'Hund')
where $name contains text 'Hans' using fuzzy
return $name, $name
(: returns error: Stopped at line 3, column 19: [XPST0008] 
Undefined variable $name. :)
Run Code Online (Sandbox Code Playgroud)

我想要做的只是返回两次名称变量.当然,我想做一些更复杂的事情.例如,给定一个doc(取自w3):

<?xml version="1.0" encoding="ISO-8859-1"?>

<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>
Run Code Online (Sandbox Code Playgroud)

我已经尝试执行一些我在Stack Overflow中接受的答案中看到的查询,并且我已经产生了负面结果.例如:

let $sep := ','
for $x in doc('test')/bookstore
  where fn:matches($x/book, 'XC')
  return fn:string-join( ($x/book/title/text(), $x/book/author/text(), 
  $x/book/price/text()), $sep)
(: Stopped at line 3, column 31: [XPTY0004] Single item expected, 
(element book { ... }, element book { ... }, ...) found. :)
Run Code Online (Sandbox Code Playgroud)

-

我想返回任何类别属性等于"web"的书籍的作者,年份和标题,这是一个标题元素,其语言属性为英语,其值正好是"Learining XML",其任何子项包含文本"Erik T"; 或其年份晚于2003年,其任何后代包含文本XML,其价格低于20.00美元.

我认为这显示了XQuery的多功能性.如果不能返回并实际输入目标列表,则该软件基本上是无用的.我发现没有一个可靠的答案或教程甚至涵盖上述查询的一小部分; 但是,有关于如何进行数学比较和顺序功能的查询.这些都以他们自己的方式有用,但是开始时,它们并不像根据其中发现的结果返回表的多个列那么重要.

Jen*_*rat 13

在第三次尝试中你已经非常接近,只是括号丢失了:

for $name in ('Hanz', 'Heinz', 'Hans', 'Huns', 'Hund')
where $name contains text 'Hans' using fuzzy
return ($name, $name)
Run Code Online (Sandbox Code Playgroud)

您可以按此顺序返回任意变量.

警告:XQuery不知道嵌套序列,如果你这样做,它们就会被连接起来.如果需要嵌套序列,则必须构造一个将返回的XML树,例如.

return <names>
         <name>{$name}</name>
         <name>{$name}</name>
       </names>
Run Code Online (Sandbox Code Playgroud)

这个不包含任何序列,但它应该显示模式.

  • 你的错误是一个非常简单和常见的错误,不理解运算符优先级.有两种方法可以学习:通过经验,并通过阅读规范.XQuery的学习资源很少,这是非常正确的.这很好,因为这些天人们不希望为这些资源支付任何费用. (2认同)