Difference between revisions of "XQuery Recipes"
Jump to navigation
Jump to search
(Added Leo's function (Thanks to Leo & Huib) from https://mailman.uni-konstanz.de/pipermail/basex-talk/2011-January/001034.html) |
|||
| Line 19: | Line 19: | ||
</pre> | </pre> | ||
| + | == Transform List to Tree == | ||
| + | This snippet transform a ''flat'' list of elements with <code>parentId</code>-references to a nested list. | ||
| + | |||
| + | <pre class="brush:xquery"> | ||
| + | declare function local:link($entries as node()*, $id as xs:string) { | ||
| + | let $entry := $entries[@id eq $id], | ||
| + | $children := $entries[@parentId eq $id] | ||
| + | return element entry { | ||
| + | $entry/@*, | ||
| + | for $child in $children | ||
| + | return local:link($entries, $child/@id) | ||
| + | } | ||
| + | }; | ||
| + | |||
| + | let $entries := | ||
| + | <entries> | ||
| + | <entry id="entry1" /> | ||
| + | <entry id="entry2" parentId="entry1" /> | ||
| + | <entry id="entry3" parentId="entry1" /> | ||
| + | <entry id="entry4" parentId="entry2" /> | ||
| + | <entry id="entry5" parentId="entry2" /> | ||
| + | <entry id="entry6" parentId="entry3" /> | ||
| + | <entry id="entry7" parentId="entry3" /> | ||
| + | </entries> | ||
| + | return local:link($entries/entry, 'entry1') | ||
| + | </pre> | ||
| + | results in | ||
| + | <pre class="brush:xml"> | ||
| + | <entry id="entry1"> | ||
| + | <entry id="entry2" parentId="entry1"> | ||
| + | <entry id="entry4" parentId="entry2"/> | ||
| + | <entry id="entry5" parentId="entry2"/> | ||
| + | </entry> | ||
| + | <entry id="entry3" parentId="entry1"> | ||
| + | <entry id="entry6" parentId="entry3"/> | ||
| + | <entry id="entry7" parentId="entry3"/> | ||
| + | </entry> | ||
| + | </entry> | ||
| + | </pre> | ||
[[Category:XQuery]] | [[Category:XQuery]] | ||
Revision as of 23:32, 24 January 2011
This page contains code snippets that mainly originate from our basex-talk mailing list.
Computed Elements
Returns dynamically named elements:
let $root := "element"
let $value := "hi"
let $contents := <foo>Bar!</foo>
return element { $root } {
attribute { "about" } { $value }, $contents
}
The result is an XML fragment with <element> as root node:
<element about="hi"> <foo>Bar!</foo> </element>
Transform List to Tree
This snippet transform a flat list of elements with parentId-references to a nested list.
declare function local:link($entries as node()*, $id as xs:string) {
let $entry := $entries[@id eq $id],
$children := $entries[@parentId eq $id]
return element entry {
$entry/@*,
for $child in $children
return local:link($entries, $child/@id)
}
};
let $entries :=
<entries>
<entry id="entry1" />
<entry id="entry2" parentId="entry1" />
<entry id="entry3" parentId="entry1" />
<entry id="entry4" parentId="entry2" />
<entry id="entry5" parentId="entry2" />
<entry id="entry6" parentId="entry3" />
<entry id="entry7" parentId="entry3" />
</entries>
return local:link($entries/entry, 'entry1')
results in
<entry id="entry1">
<entry id="entry2" parentId="entry1">
<entry id="entry4" parentId="entry2"/>
<entry id="entry5" parentId="entry2"/>
</entry>
<entry id="entry3" parentId="entry1">
<entry id="entry6" parentId="entry3"/>
<entry id="entry7" parentId="entry3"/>
</entry>
</entry>