[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message]

Re: RE: merging generic elements in a parent-child rel

Subject: Re: RE: 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)
first child rel
--- "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

PURCHASE STYLUS STUDIO ONLINE TODAY!

Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!

Buy Stylus Studio Now

Download The World's Best XML IDE!

Accelerate XML development with our award-winning XML IDE - Download a free trial today!

Don't miss another message! Subscribe to this list today.
Email
First Name
Last Name
Company
Subscribe in XML format
RSS 2.0
Atom 0.3
Site Map | Privacy Policy | Terms of Use | Trademarks
Free Stylus Studio XML Training:
W3C Member
Stylus Studio® and DataDirect XQuery ™are products from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2011 All Rights Reserved.