This is the mail archive of the xsl-list@mulberrytech.com mailing list .


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: RE: merging generic elements in a parent-child relationship Part II


--- "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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]