im using basex, implements xquery 3.0.
how embellish xml datasource in xquery, without having type out elements want include? example, consider following xml:
<x> <name>the root</name> <y> <name> level 1</name> <z> <name>level 2a</name> <value>1</value> </z> </y> <y> <name>level 1b</name> <z> <name>level 2b</name> <value>2</value> </z> </y> </x>
i want add sum of values on each level, this:
<x> <name>the root</name> <value>3</value> <y> <name> level 1</name> <value>1</value> <z> <name>level 2a</name> <value>1</value> </z> </y> <y> <name>level 1b</name> <value>2</value> <z> <name>level 2b</name> <value>2</value> </z> </y> </x>
i can use xquery this:
for $x in /x return <x>{ $x/name, <value>{sum($x//value)}</value>, $y in $x/y return <y>{ $y/name, <value>{sum($y//value)}</value>, $y/z }</y> }</x>
but gets tedious fast, when have lot of elements have repeat. there way result without having type out attributes , elements want preserve in result set?
sure can! xquery quite powerful. better, basex not supports xquery 3.0, xquery update, guess more relevant here.
xquery querying language. therefore, if want insert elements @ places, have recreate whole element did in example. however, xquery update adds constructs update documents, e.g. can use update values in database. if want locally transform value there transform expression.
because construct in specification quite bulky introduced basex-specific keyword update
, can use transform xml document.
so using query this:
./x update ( insert node <value>{sum(.//value)}</value> after ./name, $y in ./y return insert node <value>{sum($y//value)}</value> after $y/name )
of course, depending on how elements repeating (this quite clear question), use e.g. recursively insert such node @ appropriate places. 1 more hint doing so: if want dynamically select element, necessary write instead of /x
better /*[local-name() = 'x']
element name not have static.
Comments
Post a Comment