[xquery-talk] two xml match/diffes

Martin Probst martin at x-hive.com
Wed Jan 17 11:51:22 PST 2007


> I'm new to the xquery and want to have a query to join
> two xml files to find the matches and differences, e.g
> a.xml:
> <root1>
> <a1>1</a1>
> <a2>3</a2>
> <a3>5</a3>
> </root1>
>
> b.xml:
> <root2>
> <b1>1</b1>
> <b2>2</b2>
> <b3>3</b3>
> </root2>
>

What about:

let $as := doc('a.xml')/root1/*
let $bs := doc('b.xml')/root2/*
let $matches-a := $as[. = $bs]
let $matches-b := $bs[. = $as]
return
   <res>
   {
     <same>
       {
         for $match in $matches-a
         return <match from="{ node-name($match) }">{ string 
($match) } </match>
       }
     </same>,
     <root1>{ $as except $matches-a }</root1>,
     <root2>{ $bs except $matches-b }</root2>
   }
   </res>

It returns "match" elements for the matches and stores the original  
node name in an attribute. You can of course also create a new  
element type for each match, see James' query for that.

Regards,
Martin



More information about the talk mailing list