从XQuery 3.0中的多个输入返回多个值?

时间:2012-09-17 07:03:37

标签: 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. :)

我要做的只是返回两次名称变量。当然,我想做一些更复杂的事情。例如,给定一个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>

我尝试执行一些我在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. :)

-

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

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

1 个答案:

答案 0 :(得分:13)

你的第三次尝试真的很接近,只是括号丢失了:

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

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

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

return <names>
         <name>{$name}</name>
         <name>{$name}</name>
       </names>

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