Hi Martin,
Thanks for replying.
I have a variable in which I have my Item tag. I have one template defined
for PackageNumber/@level (which is inside Item) for which I have set
mode="step2". I want to call the same functionality of this template but
with few modification. So I want to create 2 more templates for
PackageNumber/@level with mode="step3" and mode="step4". I will call these
based on certain conditions using apply-template tag like this,
<xsl:apply-templates select="PackNumber/@level" mode="step2" />;
<xsl:apply-templates select="PackNumber/@level" mode="step3" /> and
<xsl:apply-templates select="PackNumber/@level" mode="step4" />
This is what I am trying:
<?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="PackNumber/@level" mode="step3">
....Some rules here.......
</xsl:template>
<xsl:template match="PackNumber/@level" mode="step4">
....Some rules here.......
</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:choose>
<xsl:when test="Condition1">
<xsl:apply-templates
select="exsl:node-set($union)/*" mode="step2" />
</xsl:when>
<xsl:when test="Condition2">
<xsl:apply-templates
select="exsl:node-set($union)/*" mode="step3" />
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates
select="exsl:node-set($union)/*" mode="step4" />
</xsl:otherwise>
</xsl:choose>
</target>
</A>
</xsl:template>
</xsl:stylesheet>
I read in O'Relly's XSLT book that to process same set of nodes several
times, use mode attribute of xsl:template element. I want to do the same.
But if I call the template using mode it is printing only the text nodes.
How can I print the node-sets?
Thanks,
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
--~--