Subject: Re: RE: [xsl] merging generic elements in a parent-child relationship Part II From: Dimitre Novatchev <dnovatchev@xxxxxxxxx> Date: Thu, 27 Jun 2002 13:26:08 -0700 (PDT) |
--- "Matias Woloski" <woloski at sion dot com> wrote: > > I've solved both problems! > I did this for the param problem > <xsl:apply-templates select="//*[name()=$TopElement]"/> > so this will choose all the elements whose name is stored in > TopElement > and the id problem > I added a variable currentTag > <xsl:variable name="currentTag" select="name()"/> > ... > <xsl:apply-templates > select="../*[@*[name()=concat('id',$currentTag)]=current()/@id]"/> > > But I have a question now... > I have the XML transformed like this > > <?xml version="1.0" encoding="UTF-8"?> > <root> > <Persona id="abc" idCountry="1"> > <b id="b1" idPersona="abc"></b> > <b id="b2" idPersona="abc"></b> > <c id="c1" idb="b1" idPersona="abc"> > </c> > </Persona> > <Persona id="abcd" idCountry="1"> > <b id="b3" idPersona="abcd"> > </b> > </Persona> > </root> > > I want to wrap each collection of elements into other element. Like > this > > <?xml version="1.0" encoding="UTF-8"?> > <root> > <PersonaGroup> > <Persona id="abc" idCountry="1"> > <bGroup> > <b id="b1" idPersona="abc"></b> > <b id="b2" idPersona="abc"></b> > </bGroup> > <cGroup> > <c id="c1" idb="b1" idPersona="abc"></c> > </cGroup> > </Persona> > <Persona id="abcd" idCountry="1"> > <bGroup> > <b id="b3" idPersona="abcd"></b> > </bGroup> > </Persona> > </PersonaGroup> > </root> > > thanks! > > ps: Dimitre thanks for answering... actually I've already solved it > in > a > similar way... do you know the last question? Yes, this is a grouping problem. Bellow I use the Muenchian method: <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:key name="kPers-Names" match="Persona/*" use="concat(generate-id(..), '||', name())"/> <xsl:strip-space elements="*"/> <xsl:output omit-xml-declaration="yes" indent="yes"/> <xsl:template match="/"> <root> <xsl:apply-templates/> </root> </xsl:template> <xsl:template match="Persona"> <xsl:copy> <xsl:copy-of select="namespace::* | @*"/> <xsl:for-each select="*[generate-id() = generate-id(key('kPers-Names', concat(generate-id(..), '||', name() ) )[1])]"> <xsl:element name="{name()}Group"> <xsl:copy-of select="key('kPers-Names', concat(generate-id(..), '||', name() ) )"/> </xsl:element> </xsl:for-each> </xsl:copy> </xsl:template> </xsl:stylesheet> When applied to your original source xml: <root> <Persona id="abc" idCountry="1"> <b id="b1" idPersona="abc"></b> <b id="b2" idPersona="abc"></b> <c id="c1" idb="b1" idPersona="abc"> </c> </Persona> <Persona id="abcd" idCountry="1"> <b id="b3" idPersona="abcd"> </b> </Persona> </root> The result of the transformation is exactly as wanted: <root> <Persona id="abc" idCountry="1"> <bGroup> <b id="b1" idPersona="abc"/> <b id="b2" idPersona="abc"/> </bGroup> <cGroup> <c id="c1" idb="b1" idPersona="abc"/> </cGroup> </Persona> <Persona id="abcd" idCountry="1"> <bGroup> <b id="b3" idPersona="abcd"/> </bGroup> </Persona> </root> Cheers, Dimitre Novatchev. __________________________________________________ Do You Yahoo!? Yahoo! - Official partner of 2002 FIFA World Cup http://fifaworldcup.yahoo.com XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
RE: [xsl] merging generic elements , Matias Woloski | Thread | RE: RE: [xsl] merging generic eleme, Matias Woloski |
Re: [xsl] Need attr="" in html..., David N Bertoni/Camb | Date | Re: [xsl] extension elements, Lars Marius Garshol |
Month |