XML/XQuery/for
Содержание
for and doc() function
<source lang="xml">
File: Data.xml
<order>
<car dept="A"> <number>1</number> <name language="en">name 1</name> </car> <car dept="B"> <number>2</number> <name language="en">name 2</name> </car> <car dept="B"> <number>3</number> <name language="en">name 3</name> </car> <car dept="C"> <number>4</number> <name language="en">name 4</name> <colorChoices>white gray</colorChoices> <desc>Our favorite shirt!</desc> </car>
</order>
File: Query.xquery
for $prod in doc("Data.xml")//car[@dept = "B"] order by $prod/name return $prod/name
Output: <?xml version="1.0" encoding="UTF-8"?> <name language="en">name 2</name> <name language="en">name 3</name>
</source>
for each loop
<source lang="xml">
File: Data.xml <?xml version="1.0"?> <cars>
<car>A</car> <car>B</car> <car>C</car> <car>D</car>
</cars> File: Query.xquery <cars> {for $i in (1,2,3,4) return <car>{$i}</car>} </cars> Output: <?xml version="1.0" encoding="UTF-8"?> <cars>
<car>1</car> <car>2</car> <car>3</car> <car>4</car>
</cars>
</source>
for each loop and range
<source lang="xml">
File: Data.xml
<?xml version="1.0"?> <cars>
<car>A</car> <car>B</car> <car>C</car> <car>D</car>
</cars> File: Query.xquery <cars> {for $i in (1 to 5, 7, 8) return <car>{$i}</car>} </cars>
Output: <?xml version="1.0" encoding="UTF-8"?> <cars>
<car>1</car> <car>2</car> <car>3</car> <car>4</car> <car>5</car> <car>7</car> <car>8</car>
</cars>
</source>
For each node in certain level
<source lang="xml">
File: Data.xml <?xml version="1.0"?> <bib>
<book year="1988"> <title>title 1</title> <publisher>publisher 1</publisher> </book> <book year="2004"> <title>title 2</title> <publisher>Publisher 2</publisher> </book>
</bib>
File: Query.xquery <books>{ for $book in doc("Data.xml")/bib/book where $book/publisher = "Publisher 2" return
element book { attribute year {$book/@year}, element title {$book/title/text()} } }
</books>
Output: <?xml version="1.0" encoding="UTF-8"?> <books>
<book year="2004"> <title>title 2</title> </book>
</books>
</source>
for loop and node text
<source lang="xml">
File: Data.xml <?xml version="1.0"?> <cars>
<car>A</car> <car>B</car> <car>C</car> <car>D</car>
</cars> File: Query.xquery <cars> {for $i in (1,2, doc("Data.xml")/cars/car/text(), 3, 4) return <car>{$i}</car>} </cars>
Output: <?xml version="1.0" encoding="UTF-8"?> <cars>
<car>1</car> <car>2</car> <car>A</car> <car>B</car> <car>C</car> <car>D</car> <car>3</car> <car>4</car>
</cars>
</source>
For stateCt
<source lang="xml">
File: Data.xml
<order num="00299432" date="2006-09-15" cust="0221A">
<item dept="A" num="1" quantity="1" color="navy"/> <item dept="B" num="2" quantity="1"/> <item dept="B" num="3" quantity="2"/> <item dept="C" num="4" quantity="1" color="white"/> <item dept="C" num="4" quantity="1" color="gray"/> <item dept="A" num="1" quantity="1" color="black"/>
</order>
File: Query.xquery <title>Order Report</title>, (for $item in doc("Data.xml")//item
order by $item/@num return $item)
Output: <?xml version="1.0" encoding="UTF-8"?> <title>Order Report</title> <item dept="A" num="1" quantity="1" color="navy"/> <item dept="A" num="1" quantity="1" color="black"/> <item dept="B" num="2" quantity="1"/> <item dept="B" num="3" quantity="2"/> <item dept="C" num="4" quantity="1" color="white"/> <item dept="C" num="4" quantity="1" color="gray"/>
</source>
Multiple for clauses
<source lang="xml">
File: Query.xquery for $i in (1, 2) for $j in ("a", "b") return <oneEval>i is {$i} and j is {$j}</oneEval> Output: <?xml version="1.0" encoding="UTF-8"?> <oneEval>i is 1 and j is a</oneEval> <oneEval>i is 1 and j is b</oneEval> <oneEval>i is 2 and j is a</oneEval> <oneEval>i is 2 and j is b</oneEval>
</source>
Multiple variable bindings in one for clause
<source lang="xml">
File: Query.xquery for $i in (1, 2), $j in ("a", "b") return <oneEval>i is {$i} and j is {$j}</oneEval>
Output: <?xml version="1.0" encoding="UTF-8"?> <oneEval>i is 1 and j is a</oneEval> <oneEval>i is 1 and j is b</oneEval> <oneEval>i is 2 and j is a</oneEval> <oneEval>i is 2 and j is b</oneEval>
</source>
Nested for each loop
<source lang="xml">
File: Query.xquery <cars> {for $i in (1 to 5, 7, 8) return
<group>{ for $a in (1 to ($i - 2)) return<car>{$a}</car>} </group> }
</cars>
Output: <?xml version="1.0" encoding="UTF-8"?> <cars>
<group/> <group/> <group> <car>1</car> </group> <group> <car>1</car> <car>2</car> </group> <group> <car>1</car> <car>2</car> <car>3</car> </group> <group> <car>1</car> <car>2</car> <car>3</car> <car>4</car> <car>5</car> </group> <group> <car>1</car> <car>2</car> <car>3</car> <car>4</car> <car>5</car> <car>6</car> </group>
</cars>
</source>
Nested for loop
<source lang="xml">
File: Data.xml <order>
<car model="A"> <id>0001</id> <name language="en">name 1</name> </car> <car model="B"> <id>0002</id> <name language="en">name 2</name> </car> <car model="B"> <id>0003</id> <name language="en">name 3</name> </car>
</order>
File: Query.xquery <ASaying>{ for $a in doc("Data.xml")/order/car[1]
for $b in doc("Data.xml")/order/car[2] return concat($a, " ", $b)
} </ASaying> Output: <?xml version="1.0" encoding="UTF-8"?> <ASaying>
0001 name 1 0002 name 2 </ASaying> </source>
Use for loop
<source lang="xml">
File: Data.xml <?xml version="1.0"?> <cars>
<car>A</car> <car>B</car> <car>C</car> <car>D</car>
</cars> File: Query.xquery <cars> {for $i in 1 to 5 return <car>{$i}</car>} </cars> Output: <?xml version="1.0" encoding="UTF-8"?> <cars>
<car>1</car> <car>2</car> <car>3</car> <car>4</car> <car>5</car>
</cars>
</source>