replacing elements with their children using update

Saturday, 27 September 2025 · 3 messages
GS
Graydon Saunders27 Sep 2025 07:32 #
Hello! So I can use
copy $c := $test
modify (for $each in $c/descendant::html:ins return replace node $each with $each/node())
return $c
to unwrap all the html ins elements in some test HTML. If I try to do this using update (because I am under the perhaps mistaken impression that update can do the same things copy/modify/return can)
$test update {replace node descendant::html:ins with 'CABBAGE'}
works fine; the various ins elements are found and replaced. But if I want to replace that particular ins element with its children, there doesn't seem to be a way to specify the children; the context item is the value of $test, not whatever descendant ins element is being replaced. How could this be written using update? Can this be written using update? thanks!
-- Graydon Saunders | graydonish at fastmail.com Þæs oferéode, ðisses swá mæg. -- Deor ("That passed, so may this.")
CG
Christian Grün27 Sep 2025 08:59 #
Hi Graydon, You can use FLWOR expressions also with the update keyword:
<xml><a>A</a></xml> update {
  for $a in ./a
  return replace node $a with $a/node()
}
A shorter (possibly cryptic) variant is to use the simple map operator (!):
<xml><a>A</a></xml> update {
  a ! (replace node . with node())
}
Hope this helps, Christian
Quoted text · Graydon Saunders · 19 lines
Von: Graydon Saunders via BaseX-Talk <basex-talk at mailman.uni-konstanz.de> Gesendet: Samstag, September 27, 2025 7:33:07 AM An: BaseX <basex-talk at mailman.uni-konstanz.de> Betreff: [basex-talk] replacing elements with their children using update Hello! So I can use copy $c := $test modify (for $each in $c/descendant::html:ins return replace node $each with $each/node()) return $c to unwrap all the html ins elements in some test HTML. If I try to do this using update (because I am under the perhaps mistaken impression that update can do the same things copy/modify/return can) $test update {replace node descendant::html:ins with 'CABBAGE'} works fine; the various ins elements are found and replaced. But if I want to replace that particular ins element with its children, there doesn't seem to be a way to specify the children; the context item is the value of $test, not whatever descendant ins element is being replaced. How could this be written using update? Can this be written using update? thanks! -- Graydon Saunders | graydonish at fastmail.com<mailto:graydonish at fastmail.com> Þæs oferéode, ðisses swá mæg. -- Deor ("That passed, so may this.")
GS
Graydon Saunders27 Sep 2025 13:27 #
Hi Christian - That helps enormously; thank you! I got hung up with the FLOWR expression because $test update {for $a in $test/descendant::html:ins return ....} doesn't work and I have yet to establish useful mental patterns for what the "node was not created by transform expression" error message means. The terse second version is what I was after; thank you! -- Graydon
Quoted text · Christian Grün · 51 lines
On Sat, Sep 27, 2025, at 02:59, Christian Grün wrote: > Hi Graydon, > > You can use FLWOR expressions also with the update keyword: > > <xml><a>A</a></xml> update { > for $a in ./a > return replace node $a with $a/node() > } > > A shorter (possibly cryptic) variant is to use the simple map operator (!): > > <xml><a>A</a></xml> update { > a ! (replace node . with node()) > } > > Hope this helps, > Christian > > > *Von:* Graydon Saunders via BaseX-Talk <basex-talk at mailman.uni-konstanz.de> > *Gesendet:* Samstag, September 27, 2025 7:33:07 AM > *An:* BaseX <basex-talk at mailman.uni-konstanz.de> > *Betreff:* [basex-talk] replacing elements with their children using update > > Hello! > > So I can use > > copy $c := $test > modify (for $each in $c/descendant::html:ins return replace node $each with $each/node()) > return $c > > to unwrap all the html ins elements in some test HTML. > > If I try to do this using update (because I am under the perhaps mistaken impression that update can do the same things copy/modify/return can) > > $test update {replace node descendant::html:ins with 'CABBAGE'} > > works fine; the various ins elements are found and replaced. But if I want to replace that particular ins element with its children, there doesn't seem to be a way to specify the children; the context item is the value of $test, not whatever descendant ins element is being replaced. > > How could this be written using update? Can this be written using update? > > thanks! > > -- > Graydon Saunders | graydonish at fastmail.com > Þæs oferéode, ðisses swá mæg. > -- Deor ("That passed, so may this.") > >

⚡Generated with XQuery