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