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

John Snelson john.snelson at oracle.com
Tue Nov 6 16:35:23 PST 2007


Maybe there's not a lot of difference in the two examples given - but I 
guess my preference will always be for a non-XML syntax for my code if I 
have a choice.

John

Andrew Welch wrote:
> 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
>>
> 
> 


-- 
John Snelson, Oracle Corporation
Berkeley DB XML:        http://www.oracle.com/database/berkeley-db/xml
XQilla:                                  http://xqilla.sourceforge.net


More information about the talk mailing list