[xquery-talk] replacing a node in in-memory XML

Andrew Welch andrew.j.welch at gmail.com
Tue Nov 6 16:15:58 PST 2007


Doesn't the OP want to set service/@value to true that matches the input?

If so the XSLT could be the "identity template + plus specific
template" pattern:

<xsl:template match="@*|node()">
  <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="services">
  <services>
    <service value="{service = 1}">1</service>
    <service value="{service = 2}">2</service>
    <service value="{service = 3}">3</service>
  </services>
</template>

which i think is quite nice and easy to read too, once you get the way
apply-templates works.  It's also very easy to add further specific
templates, and of course its open to be overridden by a stylesheet
that imports it.


On 06/11/2007, John Snelson <john.snelson at oracle.com> wrote:
> Hi Wolfgang,
>
> In the absence of XQuery Update, I really like your technique for doing
> this transformation. I think it's actually simpler and easier to read
> than the equivalent XSLT.
>
> John
>
> Wolfgang Meier wrote:
> > Hi Robert,
> >
> >> I am trying to figure out the best way to replace a node within an in-memory
> >> XML fragment.
> >
> > I really like to use the typeswitch statement for things like this:
> >
> > declare function t:replace($node as node()) as node() {
> >     typeswitch ($node)
> >         case $elem as element(services) return
> >             <services>
> >                 <service value="false">1</service>
> >                 <service value="true">2</service>
> >                 <service value="false">3</service>
> >             </services>
> >         case $elem as element() return
> >            element { node-name($elem) } {
> >                 $elem/@*, for $child in $elem/node() return t:replace($child)
> >             }
> >         default return $node
> > };
> >
> > t:replace(doc("test.xml")/*)
> >
> > Wolfgang
> > _______________________________________________
> > talk at x-query.com
> > http://x-query.com/mailman/listinfo/talk
>
>
> --
> John Snelson, Oracle Corporation
> Berkeley DB XML:        http://www.oracle.com/database/berkeley-db/xml
> XQilla:                                  http://xqilla.sourceforge.net
> _______________________________________________
> talk at x-query.com
> http://x-query.com/mailman/listinfo/talk
>


-- 
Andrew Welch
http://andrewjwelch.com
Kernow: http://kernowforsaxon.sf.net/


More information about the talk mailing list