[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message] Re: This could be simple, but not for me!
Hi Kenny, You are first grouping by <Detail>, and then you want to do a 2nd level grouping by <City>. IMO, this seems not very logical! (if I am not understanding something wrong). Please try this XSL (this does not provide solution to your second requirement) - <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text" version="1.0" encoding="UTF-8" indent="yes"/> <xsl:key name="detail-key" match="Detail" use="." /> <xsl:template match="/Root"> <xsl:for-each select="//Detail"> <xsl:if test="generate-id(.) = generate-id(key('detail-key', .)[1])"> <xsl:value-of select="@no" /><xsl:text>, </xsl:text><xsl:value-of select="." /><xsl:text>
</xsl:text> <xsl:for-each select="key('detail-key', .)"> <xsl:value-of select="../../../../City" /><xsl:text>
</xsl:text> <xsl:value-of select="../../Name" /><xsl:text>
</xsl:text> </xsl:for-each> </xsl:if> </xsl:for-each> </xsl:template> </xsl:stylesheet> Regards, Mukul --- "Kenny Bogoe (BogoeMD)" <kenny@xxxxxxxxx> wrote: > Thanks, Andrew > > This is very very close to what I need. But the city > name has to be there > only once for all names like: > > > 100, Red > City1 > Name1 > Name10 > Name100 > ...etc > > City2 > Name4 > Name40 > ... > > 200, Blue > City1 > Name2 > Name20 > ... > > City2 > Name5 > ... > > 300, Green > City1 > Name3 > Name30 > Name300 > Name3000 > ... > > 400, Yellow > City2 > Name6 > ... > > Is that possible as well? > > /Kenny > > > > > >> Hi, > >> > >> Though I have been working sometime with XSLT, I > am having > >> trouble with this transformation. Anyone know how > to do this? > >> The XML source is from a database and is really > really huge > >> in size, so performance of the transformation is > very critical... > >> > >> > >> <Root> > >> <Community> > >> <City>City1</City> > >> <A> > >> <B> > >> <Name>Name1</Name> > >> <Info> > >> <Detail no="100">Red</Detail> > >> </Info> > >> </B> > >> <B> > >> <Name>Name2</Name> > >> <Info> > >> <Detail > no="200">Blue</Detail> > >> </Info> > >> </B> > >> <B> > >> <Name>Name3</Name> > >> <Info> > >> <Detail > no="300">Green</Detail> > >> </Info> > >> </B> > >> </A> > >> </Community> > >> <Community> > >> <City>City2</City> > >> <A> > >> <B> > >> <Name>Name4</Name> > >> <Info> > >> <Detail no="100">Red</Detail> > >> </Info> > >> </B> > >> <B> > >> <Name>Name5</Name> > >> <Info> > >> <Detail > no="200">Blue</Detail> > >> </Info> > >> </B> > >> <B> > >> <Name>Name6</Name> > >> <Info> > >> <Detail > no="400">Yellow</Detail> > >> </Info> > >> </B> > >> </A> > >> </Community> > >> </Root> > >> > >> > >> This is the result I need to produce: > >> > >> > >> 100, Red > >> > >> City1 > >> Name1 > >> > >> City2 > >> Name4 > >> > >> > >> 200, Blue > >> > >> City1 > >> Name2 > >> > >> City2 > >> Name5 > >> > >> 300, Green > >> > >> City1 > >> Name3 > >> > >> 400, Yellow > >> > >> City2 > >> Name6 > > > > Heres a stylesheet that will do it. It's a > grouping problem, you just > > need to group <Detail> elements by their id > attibute and text content, > > then apply templates to only the first one in the > group. Check out > > jeni's site for more on grouping > http://www.jenitennison.com > > > > (I've html like tags in the output rather than > whitespace so my IDE can > > tidy it for me :) You may want to replace the > ancestor:: use with > > another key to help performance) > > > > <xsl:stylesheet version="1.0" > > xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> > > > > <xsl:key name="details" match="Detail" > use="concat(@no,'/',.)"/> > > > > <xsl:template match="/"> > > <root> > > <xsl:apply-templates > select="//Detail[generate-id() = > > > generate-id(key('details',concat(@no,'/',.))[1])]"/> > > </root> > > </xsl:template> > > > > <xsl:template match="Detail"> > > <div detail="{concat(@no,', ',.)}"> > > <xsl:for-each > select="key('details',concat(@no,'/',.))"> > > <span> > > <xsl:value-of > select="ancestor::Community/City"/>,<xsl:text/> > > <xsl:value-of > select="parent::Info/preceding-sibling::Name"/> > > </span> > > </xsl:for-each> > > </div> > > </xsl:template> > > > > </xsl:stylesheet> > > > > > > cheers > > andrew __________________________________ Do you Yahoo!? Friends. Fun. Try the all-new Yahoo! Messenger. http://messenger.yahoo.com/
|
PURCHASE STYLUS STUDIO ONLINE TODAY!Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced! Download The World's Best XML IDE!Accelerate XML development with our award-winning XML IDE - Download a free trial today! Subscribe in XML format
|