Hi Michael,

> Manipulation of an XML structure .... with flexible declare function ....
>
> If there are some similar issues or solutions in BaseX community,
> this will be very interesting. Any other sources to learn more about?

You can have a look at the lecture slides that are listed at [1], in
particular “XQuery: More than Just a Query Language”. Our
documentation contains various practical XQuery examples as well (see
e.g. [2]). The 2nd edition of Priscilla Walmsley’s book is one of the
best available printed resources [3]. It was published end of 2015, so
it includes all new features of XQuery 3 and XQuery 3.1.

It takes a while and efforts to explore the full complexity and
variety of the XQuery language, but may save you a lot of time in the
long term.

Christian

[1] http://phobos103.inf.uni-konstanz.de/xml15
[2] http://docs.basex.org/wiki/Update
[3] http://shop.oreilly.com/product/0636920035589.do



> Christian Grün hat am 29. Oktober 2017 um 17:10 geschrieben:
>
>
> Hi Michael,
>
> Please note that an expression will always be evaluated before its
> result will be bound to a variable.
>
> You didn’t mention what result you would expect. I guess it should be
> as follows:
>
> textBBB
>
> You could pass on a path string to your function and navigate through
> the single steps, e.g. with fold-left [1]:
>
> declare function local:node-add($xml, $path, $value) {
> copy $copy := $xml
> modify (
> let $target := fold-left(
> tokenize($path, '/'),
> $copy,
> function($node, $step) {
> $node/*[name() = $step]
> }
> )
> return insert node $value into $target
> )
> return $copy
> };
>
> local:node-add(
> text,
> 'xml',
> BBB
> )
>
> If you need more flexibility, you can pass on a function that takes
> care of the navigation inside the copy/modify or update expression:
>
> declare function local:node-add($xml, $target, $value) {
> $xml update {
> insert node $value into $target(.)
> }
> };
> local:node-add(
> document { },
> function($n) { $n/A/B },
>
> )
>
> Best,
> Christian
>
> [1] http://docs.basex.org/wiki/Higher-Order_Functions#fn:fold-left
>
>
>
> On Sun, Oct 29, 2017 at 4:34 PM, wrote:
>
> Hello,
>
> How to add/replace a complete node in a node tree,
> with done by a function and by according function parameters.
> That means with flexible instructions.
>
> Such as:
>
> declare function local:NodeAdd($XML, $XMLPath, $XMLValue)
> {
> ??
> };
>
> let $XML := text
> let $XMLAdd := BBB
> let $XMLPath := $XML/xml
>
>
> return
> local:NodeAdd($XML, $XMLPath , $XMLAdd)
>
> Problem:
> Following examples didn't work, because an internal reference to
> copy-XML-structure is needed/forced.
>
> example 1: copy / modify
>
> declare function local:NodeAdd($XML, $XMLPath, $XMLValue)
> {
>
> copy $XML2 := $XML
> modify (
> insert node $XMLValue into $XML2/xml
> )
> return
> $XML2
> };
>
> But: Instead of into $XML2/xml,
>
> into $XML/xml is needed, respectively into $XMLPath
>
>
> Thanks a lot
> Michael

Reply via email to