[XSL-LIST Mailing List Archive Home]
[By Thread]
[By Date]
RE: [xsl] recursion with xsl:apply-templates
Subject: RE: [xsl] recursion with xsl:apply-templates From: "Michael Kay" <mhk@xxxxxxxxx> Date: Wed, 27 Aug 2003 12:26:34 +0100 |
Firstly, the line <xsl:apply-templates select="descendant::*"/> looks wrong. This processes the descendants at each level; but at each level a node is going to process its own children, so this is unnecessary. Secondly, you've left something out: <xsl:apply-templates select> What was the value of the select attribute? Finally, I don't see why you need recursion at all. I think the following should do the job: <xsl:template match="HEADER"> ... <xsl:apply-templates select="*[@index]" mode="id"/> </xsl:template> <xsl:template match="*" mode="id"> <xsl:copy> <xsl:copy-of select="@*[not(name()='index')]"/> <xsl:variable name="p" select="position()"/> <xsl:copy-of select="/transformation/id_list/id[$p]"/> <xsl:copy-of select="child::node()"/> </xsl:copy> </xsl:template> But this doesn't copy the elements without an @index attribute. If that's a requirement, and if they have to be kept in their original order, then you can't rely on position() in this way. But all is not lost: instead of position(), use count(preceding::*[@index])+1. Michael Kay > -----Original Message----- > From: owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx > [mailto:owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx] On Behalf Of > Volker Witzel > Sent: 27 August 2003 10:14 > To: XSL-List@xxxxxxxxxxxxxxxxxxxxxx > Subject: [xsl] recursion with xsl:apply-templates > > > Hi, > > I have a problem with a recursion and I don't have a clue, why my > solution does not work. I did not find anything on the web, > so your help > is greatly appreciated. > > The problem: > I need to perform an XML to XML transformation to augment the > data with > unique keys. > The structure is as follows: > <transformation> > <IRF> > <HEADER> > <REC_IR020_01 index="1"> > <UNB_S002_0004>16</UNB_S002_0004> > ... > </REC_IR020_01> > <REC_IR030_01 index="1"> > <UNH_0062>03081402160553</UNH_0062> > ... > </REC_IR030_01> > ... > </IRF> > <id_list> > <id>2003-08-25 15:36:59.534096</id> > ... > </id_list> > </transformation> > > I do not know all tag names, but I know that I have some > elements with > an index attribute, which I need to transform to > <REC_IR020_01> > <id>2003-08-25 15:36:59.534096</id> > <UNB_S002_0004>16</UNB_S002_0004> > ... > </REC_IR020_01> > So I have to strip the index attribute and fetch one unique > id from the > id_list for each occurence of an index attribute. > > My Solution: > I thought it's startightforward with XSL. My code: > > <?xml version="1.0" encoding="UTF-8"?> > <xsl:stylesheet version="1.0" > xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > xmlns:xalan="http://xml.apache.org/xslt"> > <xsl:output method="xml" indent="yes" encoding="UTF-8" > omit-xml-declaration="no" xalan:indent-amount="2" /> > <xsl:strip-space elements="*"/> > <xsl:template match="/transformation"> > <xsl:apply-templates select="IRF"/> > </xsl:template> > <xsl:template match="IRF"> > <xsl:copy> > <xsl:copy-of select="@*"/> > <xsl:apply-templates select="descendant::*"/> > </xsl:copy> > </xsl:template> > <xsl:template match="node()"> > <xsl:param name="idCount" select="1"/> > <xsl:choose> > <xsl:when test="@index"> > <xsl:copy> > <xsl:element name="test"><xsl:value-of > select="$idCount"/></xsl:element> > <xsl:call-template name="addIdElement"> > <xsl:with-param name="idCount" select="$idCount"/> > </xsl:call-template> > <xsl:apply-templates select> > <xsl:with-param name="idCount" select="$idCount + 1"/> > </xsl:apply-templates> > </xsl:copy> > </xsl:when> > <xsl:otherwise> > <xsl:copy> > <xsl:apply-templates> > <xsl:with-param name="idCount" select="$idCount"/> > </xsl:apply-templates> > </xsl:copy> > </xsl:otherwise> > </xsl:choose> > </xsl:template> > <xsl:template name="addIdElement"> > <xsl:param name="idCount"/> > <xsl:element name="id"> > <xsl:copy-of select="/transformation/id_list/id[$idCount]"/> > </xsl:template> > </xsl:stylesheet> > > My problem is that the lines > <xsl:apply-templates select> > <xsl:with-param name="idCount" select="$idCount + 1"/> > </xsl:apply-templates> > do not call the template with the inceremnted parameter, so it always > runs with the default value 1. > > Any ideas where my brain is scrumbled? > Volker. > > > > XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list > XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] recursion with xsl:apply-, David Carlisle | Thread | Re: [xsl] recursion with xsl:apply-, Volker Witzel |
RE: [xsl] problem with variable and, Michael Kay | Date | RE: [xsl] URL rewriting with sessio, Michael Kay |
Month |
Keywords