Hi,
I have 2 xmls which I am trying to merge based on certain condition. The
xmls and xslt rules are given below. I want to
call "PackNumber/@level" template using mode attribute but if I do so only
text nodes are getting printed in the output. If I remove mode from
"PackNumber/@level" then I am getting the correct output.
File1.xml
<?xml version="1.0"?>
<Move-Afile>
<Afile>
<Item>
<PackNumber level="1">2</PackNumber>
</Item>
<Item>
<PackNumber level="1">6</PackNumber>
</Item>
<Item>
<PackNumber level="4">8</PackNumber>
</Item>
</Afile>
</Move-Afile>
File2.xml
<?xml version="1.0"?>
<Move-Afile>
<Afile>
<Item>
<PackNumber level="9">1</PackNumber>
</Item>
<Item>
<PackNumber level="8">2</PackNumber>
</Item>
<Item>
<PackNumber level="488">3</PackNumber>
</Item>
</Afile>
</Move-Afile>
Output should like something like this:
Output.xml
<A>
<target>
<Item>
<PackNumber>
<counter level="1"/>
<PNumber>1</PNumber>
</PackNumber>
</Item>
<Item>
<PackNumber>
<counter level="1"/>
<PNumber>1</PNumber>
</PackNumber>
</Item>
<Item>
<PackNumber>
<counter level="2"/>
<PNumber>4</PNumber>
</PackNumber>
</Item>
<Item>
<PackNumber>
<counter level="3"/>
<PNumber>9</PNumber>
</PackNumber>
</Item>
<Item>
<PackNumber>
<counter level="4"/>
<PNumber>8</PNumber>
</PackNumber>
</Item>
<Item>
<PackNumber>
<counter level="5"/>
<PNumber>488</PNumber>
</PackNumber>
</Item>
</target>
</A>
XSL Rules:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:exsl="http://exslt.org/common"
exclude-result-prefixes="exsl"
version="1.0">
<xsl:output indent="yes" omit-xml-declaration="yes"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="text()" />
<xsl:template match="Item" mode="step1">
<xsl:copy-of select="." />
</xsl:template>
<xsl:template match="PackNumber/@level" mode="step2">
<xsl:choose>
<xsl:when test="not(preceding::PackNumber/@level =.)">
<xsl:element name="counter">
<xsl:attribute name="level">
<xsl:value-of
select="count(preceding::PackNumber/@level[not(preceding::PackNumber/@level=
.)])+1"/>
</xsl:attribute>
</xsl:element>
</xsl:when>
<xsl:otherwise>
<xsl:element name="counter">
<xsl:attribute name="level">
<xsl:value-of
select="count(preceding::PackNumber/@level[not(preceding::PackNumber/@level=
.)])"/>
</xsl:attribute>
</xsl:element>
</xsl:otherwise>
</xsl:choose>
<PNumber>
<xsl:value-of select="."/>
</PNumber>
</xsl:template>
<xsl:template match="/">
<xsl:variable name="union">
<xsl:apply-templates select="//Item" mode="step1" />
<xsl:apply-templates select="document('File2.xml')/*//Item"
mode="step1" />
</xsl:variable>
<A>
<target>
<xsl:apply-templates select="exsl:node-set($union)/*"
mode="step2" />
</target>
</A>
</xsl:template>
</xsl:stylesheet>
Any suggestions on how to achieve the correct output using mode attribute?
I don't want to do this without mode as I have 3 more conditions.
Thanks in advance.
Regards,
Varun
--~----------------------------------------------------------------
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
EasyUnsubscribe: http://lists.mulberrytech.com/unsub/xsl-list/1167547
or by email: xsl-list-unsub(_at_)lists(_dot_)mulberrytech(_dot_)com
--~--