[xsl] Calling xsl:template through mode attribute prints only text nodes

Subject: [xsl] Calling xsl:template through mode attribute prints only text nodes
From: "varun bhatnagar varun292006@xxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Date: Thu, 28 Aug 2014 14:47:54 -0000
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

Current Thread