Altova Mailing List Archives>Archive Index >xml-dev Archive Home >Recent entries >Thread Prev - RE: [xml-dev] merging xml files [Thread Next] RE: [xml-dev] merging xml filesTo: "'Pankaj Rathi'" <Pankaj.Rathi@------.--->,<xml-dev@-----.---.---> Date: 9/1/2004 6:17:00 PM > > 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 | ||||||
| Company | Legal | Press | Partners | Careers | Sitemap | Contact Us | Altova Blog | Mobile | Full Site | |||
|
