Возвращать несколько значений из нескольких входов в 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. :)

Я пытаюсь просто дважды вернуть переменную имени. Конечно, хотелось бы сделать что-нибудь посложнее. Например, учитывая документ (взятый из 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", элементом заголовка, атрибут языка которого является английским, а значение - в точности "Learning XML" и любой дочерний элемент которого содержит текст. «Эрик Т»; или чей год позже 2003 года, чьи потомки содержат текст XML и чья цена меньше 20,00 долларов США.

Я думаю, это показывает универсальность XQuery. Без возможности вернуть и фактически ввести список целей программное обеспечение по существу бесполезно. Я обнаружил, что нет твердого ответа или учебника, который охватил бы даже небольшую часть вышеуказанного запроса; однако есть вопросы о том, как выполнять математические сравнения и функции упорядочивания. Они полезны по-своему, но для начала они не так важны, как возможность возвращать несколько столбцов таблицы на основе найденных в них результатов.


person Wolfpack'08    schedule 17.09.2012    source источник
comment
Один комментарий: похоже, вы предполагаете наличие XQuery с полнотекстовым расширением, которое является необязательной функцией. Но вы ничего не предполагаете, несмотря на название, насчет XQuery 3.0.   -  person Michael Kay    schedule 17.09.2012


Ответы (1)


Вы были очень близки в своей третьей попытке, просто отсутствовали круглые скобки:

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>

Он не содержит никаких последовательностей, но должен отображать шаблон.

person Jens Erat    schedule 17.09.2012
comment
Спасибо. +1. Я очень ценю этот первый шаг к превосходной документации, которая действительно необходима. Я не уверен, где вы это узнали? Однако я убедился, что это работает. Ознакомьтесь с запросом в конце моего вопроса. Он довольно большой и сложный, но он показывает все, о чем я хотел бы найти лучшую документацию, - все, что наиболее полезно. or операторы, and операторы во всех различных частях запроса, понимаете? - person Wolfpack'08; 17.09.2012
comment
Я изучил XQuery на какой-то университетской лекции. Я еще не изучал это, но XQuery by Говорят, что Присцилла Уолмсли хорошо знакома с XQuery. Не хватает онлайн-ресурсов XQuery, некоторых Wikibook по нему и множества небольших ссылок, но я не знаю какого-либо отличного введения. Взгляните на ‹xqueryfunctions.com ›для изучения некоторых шаблонов (и предотвращения создания этих шаблонов самостоятельно). - person Jens Erat; 17.09.2012
comment
Ваша ошибка была очень простой и распространенной: вы не понимали приоритета операторов. Есть два способа узнать это: на собственном опыте и через чтение спецификации. Совершенно верно, что для XQuery не хватает хороших учебных ресурсов; в значительной степени это потому, что в наши дни люди не ожидают, что будут платить деньги за такие ресурсы. - person Michael Kay; 17.09.2012
comment
@Ranon, Спасибо, за ссылки. Я возьму эту книгу. У него есть обложка, которая автоматически вызывает у меня наибольший интерес. Мне кажется, что XQuery - важный язык, но меня беспокоит, что он не будет взаимодействовать с веб-сайтами. - person Wolfpack'08; 17.09.2012
comment
@MichaelKay Я бы не прочь заплатить за хороший ресурс, но даже когда я иду в книжный магазин, мне нравится сначала хорошенько заглянуть внутрь книги. Для меня нет ничего хуже, чем получить новую книгу и быть разочарованным отсутствием у автора правильной грамматики, плохим форматированием книги, чрезмерной сложностью блоков кода без четких объяснений и т. Д. Не только документация, но и ресурс, который указывает на отсутствие хорошей документации; Итак, действительно сложно начать работу с XQuery, и у меня такое чувство, что большинство программистов просто избегают его вообще, несмотря на его многочисленные применения. - person Wolfpack'08; 17.09.2012
comment
Кажется, трудно найти некоторые базовые концепции относительно того, возможно ли это. В некоторых случаях мне неясна степень функциональности. Например. сортировка по связанному значению в XML-документе. - person thebluephantom; 20.02.2017