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

Hans-Juergen Rennau hrennau at yahoo.de
Tue Nov 6 22:13:39 PST 2007


Hello Wolfgang,

let me add a remark about the situation when the nodes to be modified cannot be identified by type *ALONE*. For example, the document might contain many community groups, and the services element is to be replaced only in the groups (2, 31, 32, 40). In such situations, I suggest to combine the "typeswitch recursion pattern" with a "node marking pattern": a) before starting the recursion, "mark" the modification targets by collecting them in a variable, b) within the relevant typeswitch branch use a node identity-based if/else. This approach scales rather well when things get more complicated (several element types are to be partially and heterogeneously modified).

a) 
declare variable $targetNodes_services := 
   ($doc//communitygroup)[position() = (2, 31, 32, 40)]/group/services

b)
typeswitch ($node)
   case $elem as element(services) return
      if ($elem intersect $targetNodes_services) then <services>...</services>
      else

		         element {node-name($elem)} {$elem/@*, $elem/node()/local:replace(.)}
    ...

The approach helped me when I had to modify WordML documents, highly repetitive as they are in terms of element names!

With kind regards,
Hans-Juergen





       __________________________________ Ihr erstes Fernweh? Wo gibt es den schönsten Strand? www.yahoo.de/clever



More information about the talk mailing list