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 |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] XML Sumer School, Heiko Niemann kontak | Thread | Re: [xsl] Calling xsl: template thr, Martin Honnen martin |
[xsl] XML Sumer School, Flynn, Peter pflynn@ | Date | Re: [xsl] Calling xsl: template thr, Martin Honnen martin |
Month |