How to fix this concatenation of two xml file?

domloki

New Member
I want to concat two xml file.Here is the input1.xml:\[code\]<schema> <sequence> <section id="xxx"> <nodeA id="a"> <fruit id="small"> <orange id="x" method="create"> <attributes> <color>Orange</color> <year>2000</year> </attributes> </orange> </fruit> </nodeA> <nodeB id="b"> <dog id="large"> <doberman id="x" method="create"> <condition> <color>Black</color> </condition> </doberman> </dog> </nodeB> </section> </sequence></schema>\[/code\]and here input2.xml\[code\]<schema> <sequence> <section id="xxx"> <nodeA id="a"> <fruit id="small"> <melon id="x" method="create"> <attributes> <color>Green</color> </attributes> </melon> </fruit> <lemon id="z" method="delete" /> </nodeA> <nodeA id="b"> <fruit id="small"> <lime id="x" method="create"> <attributes> <color>Yellow</color> <year>2001</year> </attributes> </lime> </fruit> </nodeA> <nodeB id="b"> <dog id="small"> <poodle id="x" method="create"> <condition> <color>White</color> </condition> </poodle> </dog> </nodeB> <nodeB id="c"> <dog id="small"> <terrier id="x" method="delete" /> </dog> </nodeB> </section> </sequence></schema>\[/code\]My output:\[code\]<schema> <sequence> <section id="xxx"> <nodeA id="a"> <fruit id="small"> <orange id="x" method="create"> <attributes> <color>Orange</color> <year>2000</year> </attributes> </orange> </fruit> <fruit id="small"> <melon id="x" method="create"> <attributes> <color>Green</color> </attributes> </melon> </fruit> <lemon id="z" method="delete"/> </nodeA> <nodeB id="b"> <dog id="large"> <doberman id="x" method="create"> <condition> <color>Black</color> </condition> </doberman> </dog> <dog id="small"> <poodle id="x" method="create"> <condition> <color>White</color> </condition> </poodle> </dog> </nodeB> </section> </sequence></schema>\[/code\]While the expected output is:\[code\]<schema> <sequence> <section id="xxx"> <nodeA id="a"> <fruit id="small"> <orange id="x" method="create"> <attributes> <color>Orange</color> <year>2000</year> </attributes> </orange> </fruit> <fruit id="small"> <melon id="x" method="create"> <attributes> <color>Green</color> </attributes> </melon> </fruit> <lemon id="z" method="delete"/> </nodeA> <nodeB id="b"> <dog id="large"> <doberman id="x" method="create"> <condition> <color>Black</color> </condition> </doberman> </dog> <dog id="small"> <poodle id="x" method="create"> <condition> <color>White</color> </condition> </poodle> </dog> </nodeB> <nodeA id="b"> <!-- I'm missing this node --> <fruit id="small"> <lime id="x" method="create"> <attributes> <color>Yellow</color> <year>2001</year> </attributes> </lime> </fruit> </nodeA> <nodeB id="c"> <!-- I'm missing this node --> <dog id="small"> <terrier id="x" method="delete" /> </dog> </nodeB> </section> </sequence></schema>\[/code\]The XSLT file is like this:\[code\]<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:a="http://a.com"> <xsl:strip-space elements="*" /> <xsl:output indent="yes" method="xml" /> <xsl:param name="input2"/> <xsl:variable name="to-merge" select="document($input2)" /> <xsl:function name="a:id"> <xsl:param name="ctx"/> <xsl:value-of select="concat($ctx/local-name(), $ctx/@id)"/> </xsl:function> <xsl:key name="match" match="/schema/sequence/section/*" use="a:id(.)"/> <xsl:template match="@* | node()"> <xsl:copy> <xsl:apply-templates select="@* | node()"/> </xsl:copy> </xsl:template> <xsl:template match="*[count(. | key('match', a:id(.))) = count(key('match', a:id(.)))]"> <xsl:copy> <xsl:apply-templates select="@* | node()"/> <xsl:variable name="id" select="a:id(.)"/> <xsl:for-each select="$to-merge"> <xsl:apply-templates select="key('match', $id)/*"/> </xsl:for-each> </xsl:copy> </xsl:template></xsl:stylesheet>\[/code\]How to modify the xslt file to produce the required output? The key here is to keep the order of the node. If node exist from file1, we combine it, and if it isn't we put it at the bottom according to the order how they appear.Thanks very much.John
 
Back
Top