Changes

Jump to navigation Jump to search
3,214 bytes added ,  23:41, 8 July 2017
m
update fold-left syntax
This page contains code snippets that mainly originate from our [https://mailman.uni-konstanz.de/mailman/listinfo/basex-talk basex-talk] mailing list. == Compact Notations == <code>if</code>/<code>not</code>/<code>else</code> constructs can look pretty verbose in XQuery.However, some alternatives exist in order to make conditional code more compact: * The [[XQuery 3.0#Simple Map Operator|Simple Map Operator]] can be used to trigger an action if a value has a single item. The following two expressions are equivalent: <pre class="brush:xmlxquery">let $names := "X" return ( (: OLD :) if(count($s) = 1) then 'OK' else (), (: NEW :) $s ! 'OK')</pre> In some cases, also the first solution can be written more compact. If we know that our input will always have 0-1 items, we can write <code>if(exists($s))</code>. If our input will never be an empty string, a zero, etc, it’s sufficient to write <code>if($s)</code>. * If you want to choose the first non-empty item from two arguments, we can use the position predicate<pre class= "Element1brush:xquery">let $s := "X" return ( (: OLD :) if(exists($s)) then $s else 'default', (: NEW :) ($s, 'default')[1])</pre> Note that this only works if both of your inputs have zero or one items. == Computed Elements ==Returns dynamically named elements:<pre class ="brush:xquery">let $root := "element"let $value := "hi"let $contents :=<foo><br />Bar!</foo>return element {$nameroot }{ attribute {"about"}{$classvalue },$contents
}
</pre>
 
The result is an XML fragment with <code>&lt;element&gt;</code> as root node:
<pre class="brush:xml">
<element about="hi">
<foo>Bar!</foo>
</element>
</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>
 
== IP-Converter ==
 
This snippet converts an IP address to its numeric representation:
 
<pre class="brush:xquery">
let $ip := '134.34.226.65'
return fold-left(
tokenize($ip, '\.')!xs:integer(.),
0,
function($n, $d) { 256 * $n + $d }
)
</pre>
results in
<pre class="brush:xml">
2250433089
</pre>
 
== Count number of files ==
 
This snippets returns the number of JPG files in a directory and its sub-directories:
 
<pre class="brush:xquery">
basex "count(file:list('.',true(),'*.jpg'))"</pre>
 
The Linux equivalent is
 
<pre class="brush:xml">
find . | grep \.jpg$ | wc -l
</pre>
administrator, editor
31

edits

Navigation menu