9

私はいくつかのことを試しました:

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

私がやろうとしているのは、name 変数を 2 回返すことです。もちろん、私はもっと複雑なことをしたいと思っています。たとえば、ドキュメント (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. :)

--

言語属性が英語で、値が正確に「学習 XML」であり、子にテキストが含まれるタイトル要素のカテゴリ属性が「web」である本の著者、発行年、およびタイトルを返したいと思います。 "エリックT"; または、年が 2003 年より後で、いずれかの子孫にテキスト XML が含まれ、価格が 20.00 米ドル未満である。

これは XQuery の汎用性を示していると思います。ターゲットのリストを返すことができず、実際に入力することができなければ、ソフトウェアは本質的に役に立ちません。上記のクエリのごく一部をカバーする確かな回答やチュートリアルがないことがわかりました。ただし、数学的比較と order-by 関数の実行方法に関するクエリがあります。これらは独自の方法で役立ちますが、最初は、そこにある結果に基づいてテーブルの複数の列を返すことができるほど重要ではありません。

4

1 に答える 1

15

あなたは3回目の試みで本当に近づいてきました、かっこだけが欠けています:

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>

これにはシーケンスは含まれていませんが、パターンが表示されているはずです。

于 2012-09-17T07:31:32.473 に答える