Difference between revisions of "XQuery Recipes"

From BaseX Documentation
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 22: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>