[
Lists Home |
Date Index |
Thread Index
]
I could accomplish my task following the example on
http://www.xml.com/pub/a/2003/11/26/q-and-a.html
However, the problem I identify is that my xsl is too tied up with the xmls.
I find that Michael's flow is better as it checks for 'not' condition
instead of constructing everything in the xslt.
The problem I am with now is that this step is not very clear on how to
implement the 'not' part that is if it is required to add 'X' from 'B'
??
If we hit an E that doesn't contain an X, we add the X from B:
<xsl:template match="E[not(child::X)]">
<xsl:copy><xsl:copy-of select="@*"/><xsl:apply-templates/></xsl:copy>
<xsl:copy-of select="document('B.xml')//X"/>
</xsl:template>
??
Can you explain Michael? - what should I replace 'E' with?
Thanks again.
Pank
-----Original Message-----
From: Michael Kay [mailto:michael.h.kay@ntlworld.com]
Sent: Wednesday, September 01, 2004 7:17 PM
To: 'Pankaj Rathi'; xml-dev@lists.xml.org
Subject: RE: [xml-dev] merging xml files
>
> Looking at the interest and in reply to Michael, I am expressing my
> requirements again, in case, someone can give a refined solution.
>
> The task is to merge two xml files. Both the files have the
> same root.
> File A might or might not have node X(and its sub elements).
> File B will always have node X(and its sub elements).
>
> If File A does not contain node X:
> XSLT should get it from file B and insert it in File A under
> the defined
> location(which is not root).
>
> If File A contains node X (the location is known):
> XSLT should still get it from file B and replace the one
> existing in File A.
First let my try to rephrase your requirements using standard terminology,
to check that I have understood them correctly.
The task is to merge two XML documents. The name of the document element of
both documents is the same in both cases [but we don't use this fact].
Document A contains zero or one elements with the name X.
Document B contains exactly one element with the name X.
If document A does not contain an element named X:
the stylesheet should deep-copy the X element from document B and insert it
in Document A at a defined location.
If document A does contain an element named X:
the stylesheet should deep-copy the X element from document B and insert it
in Document A replacing the original X element.
You haven't said what "the defined location" is, but let's suppose that it's
an E element which either does or does not contain X as a child.
So, you start with an identity transform on A:
<xsl:template match="*">
<xsl:copy><xsl:copy-of select="@*"/><xsl:apply-templates/></xsl:copy>
</xsl:template>
If we hit an X, we replace it:
<xsl:template match="X">
<xsl:copy-of select="document('B.xml')//X"/>
</xsl:template>
If we hit an E that doesn't contain an X, we add the X from B:
<xsl:template match="E[not(child::X)]">
<xsl:copy><xsl:copy-of select="@*"/><xsl:apply-templates/></xsl:copy>
<xsl:copy-of select="document('B.xml')//X"/>
</xsl:template>
Michael Kay
_____________________________________________________________________
This e-mail has been scanned for viruses by MCI's Internet Managed Scanning
Services - powered by MessageLabs. For further information visit
http://www.mci.com
|