This is the mail archive of the
xsl-list@mulberrytech.com
mailing list .
RE: merging xmls
- From: "Michael Kay" <michael dot h dot kay at ntlworld dot com>
- To: <xsl-list at lists dot mulberrytech dot com>
- Date: Tue, 10 Sep 2002 18:22:10 +0100
- Subject: RE: [xsl] merging xmls
- Reply-to: xsl-list at lists dot mulberrytech dot com
I don't understand the de-duplication requirement. Your specimen output
contains a copy of each <univ> element and each <university> element
from each of the three source files. This doesn't tie in with what you
say about needing to remove duplicates.
Removing duplicates across multiple documents is a bit tricky: neither
of the standard XSLT 1.0 grouping techniques handles it directly, so you
need to build the composite document as a temporary tree and then do any
grouping that's needed. In XSLT 2.0 you can do it in one pass using
<xsl:for-each-group>.
The solution without duplicate elimination is easy:
<?xml version="1.0"?>
<university-records
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xsl:version="1.0">
<xsl:variable name="docs"
select="document('1.xml')|document('2.xml')|document('3.xml')"/>
<univ-ids>
<xsl:copy-of select="$docs//univ-ids/*"/>
</univ-ids>
<university-results>
<xsl:copy-of select="$docs//university-results/*"/>
</university-results>
</university-records>
In XSLT 2.0 you can add duplicate elimination like this:
<?xml version="1.0"?>
<university-records
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xsl:version="1.0">
<xsl:variable name="docs"
select="document('1.xml')|document('2.xml')|document('3.xml')"/>
<univ-ids>
<xsl:for-each-group select="$docs//univ-ids/*" group-by="@id">
<xsl:copy-of select="."/>
</xsl:for-each-group>
</univ-ids>
<university-results>
<xsl:for-each-group select="$docs//university-results/*"
group-by="@univ-id">
<xsl:copy-of select="."/>
</xsl:for-each-group>
</university-results>
</university-records>
Michael Kay
Software AG
home: Michael.H.Kay@ntlworld.com
work: Michael.Kay@softwareag.com
> -----Original Message-----
> From: owner-xsl-list@lists.mulberrytech.com
> [mailto:owner-xsl-list@lists.mulberrytech.com] On Behalf Of
> Laura Jenkins
> Sent: 10 September 2002 17:41
> To: xsl-list@lists.mulberrytech.com
> Subject: [xsl] merging xmls
>
>
> i have got a fairly conplicated problem ( atleast for me :( )
> i have got 3 xml files that contains university result data
> from 3 different
> regions.and i have to merge them into one xml with all the
> data from 3 xmls.
> The resultant XML should have the same structure as
> individual XMLs.. for example,
> xml1:
> <?xml version="1.0"?>
> <university-records>
> <univ-ids>
> <univ id = "KSU">
> <name>Kansas State University</name>
> <location>Kansas<location>
> </univ>
> <univ id = "FAU">
> <name>Florida Atlantic University</name>
> <location>Florida<location>
> </univ>
> <univ id = "MSU">
> <name> Mississipi State University</name>
> <location> Mississipi <location>
> </univ>
> <univ id = "OSU">
> <name>Ohio State University</name>
> <location> Ohio <location>
> </univ>
> </univ-ids>
> <university-results>
> <university univ-id = "KSU">100%</university>
> <university univ-id = "MSU">90%</university>
> <university univ-id = "FAU">80%</university>
> </university-results>
> </university-records>
>
> xml2:
> <?xml version="1.0"?>
> <university-records>
> <univ-ids>
> <univ id = "OSU">
> <name> Ohio State University</name>
> <location> Ohio <location>
> </univ>
> <univ id = "WSU">
> <name> Wisconsin state University</name>
> <location> Wisconsin <location>
> </univ>
> <univ id = "RPI">
> <name> Rensellar polytechnic Institute </name>
> <location> New Jersey <location>
> </univ>
> <univ id = "MSU">
> <name> Mississipi State University</name>
> <location> Mississipi <location>
> </univ>
> </univ-ids>
> <university-results>
> <university univ-id = "OSU">70%</university>
> <university univ-id = "WSU">100%</university>
> <university univ-id = "RPI">100%</university>
> </university-results>
> </university-records>
> xml3:
> <?xml version="1.0"?>
> <university-records>
> <univ-ids>
> <univ id = "NSU">
> <name> Newyork State University</name>
> <location> Newyork <location>
> </univ>
> <univ id = "BU">
> <name> Belmont University</name>
> <location> Belmont <location>
> </univ>
> <univ id = "WSU">
> <name>Wisconsin state University</name>
> <location> Wisconsin <location>
> </univ>
> <univ id = "BCM">
> <name> Berklee College of Music</name>
> <location> Berklee <location>
> </univ>
> </univ-ids>
> <university-results>
> <university univ-id = "NU">70%</university>
> <university univ-id = "BU">60%</university>
> <university univ-id = "BCM">100%</university>
> </university-results>
> </university-records>
>
>
> i want the resultant xml to be ...
>
> <university-records>
> <univ-ids>
>
> <univ id = "KSU">
> <name>Kansas State University</name>
> <location>Kansas<location>
> </univ>
> <univ id = "FAU">
> <name>Florida Atlantic University</name>
> <location>Florida<location>
> </univ>
> <univ id = "MSU">
> <name> Mississipi State University</name>
> <location> Mississipi <location>
> </univ>
> <univ id = "OSU">
> <name> Ohio State University</name>
> <location> Ohio <location>
> </univ>
> <univ id = "OSU">
> <name> Ohio State University</name>
> <location> Ohio <location>
> </univ>
> <univ id = "WSU">
> <name> Wisconsin state University</name>
> <location> Wisconsin <location>
> </univ>
> <univ id = "RPI">
> <name> Rensellar polytechnic Institute </name>
> <location> New Jersey <location>
> </univ>
> <univ id = "MSU">
> <name> Mississipi State University</name>
> <location> Mississipi <location>
> </univ>
> <univ id = "NSU">
> <name> Newyork State University</name>
> <location> Newyork <location>
> </univ>
> <univ id = "BU">
> <name> Belmont University</name>
> <location> Belmont <location>
> </univ>
> <univ id = "WSU">
> <name>Wisconsin state University</name>
> <location> Wisconsin <location>
> </univ>
> <univ id = "BCM">
> <name> Berklee College of Music</name>
> <location> Berklee <location>
> </univ>
>
> </univ-ids>
> <university-results>
> <university univ-id = "NU">70%</university>
> <university univ-id = "BU">60%</university>
> <university univ-id = "BCM">100%</university>
> <university univ-id = "OSU">70%</university>
> <university univ-id = "WSU">100%</university>
> <university univ-id = "RPI">100%</university>
> <university univ-id = "KSU">100%</university>
> <university univ-id = "MSU">90%</university>
> <university univ-id = "FAU">80%</university>
> </university-results>
> </university-records>
>
>
> Things to be noticed here: The <univ-ids> in each of the xml
> files have some
> <univ-id> elements which are there in other
>
> xmls as well. for example the
> <univ id = "MSU">
> <name> Mississipi State University</name>
> <location> Mississipi <location>
> </univ>
> which is in the xml2
> similarly..
> <univ id = "OSU">
> <name> Ohio State University</name>
> <location> Ohio <location>
> </univ>
> is there in both the xml files..
>
> But The final XML should not reflect this.
>
> Any Ideas as to how we can acheive this??
>
> Thanks in advance..
>
>
> _________________________________________________________________
> Send and receive Hotmail on your mobile device: http://mobile.msn.com
>
>
> XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
>
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list