Subject: Re: [xsl] Moving an element to a different grouping based on a child value: use xsl:copy-of? From: Mukul Gandhi <gandhi.mukul@xxxxxxxxx> Date: Sat, 17 Jan 2009 08:06:30 +0530 |
Hi Rob, This seems to work, <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> <xsl:output method="xml" indent="yes" /> <xsl:template match="/"> <kml xmlns="http://earth.google.com/kml/2.1"> <Document> <xsl:for-each select="station_list/snets/snet"> <xsl:variable name="idval" select="@id" /> <Folder id="{$idval}"> <name><xsl:value-of select="." /></name> <xsl:for-each select="../../stations/station[Network = $idval]"> <Placemark> <name><xsl:value-of select="@name" /></name> </Placemark> </xsl:for-each> </Folder> </xsl:for-each> </Document> </kml> </xsl:template> </xsl:stylesheet> I think xsl:copy-of will not be required. A simple for-each iteration would work. On Sat, Jan 17, 2009 at 4:25 AM, Rob Newman <rlnewman@xxxxxxxx> wrote: > Dear XSL gurus, > > I have some XML in the following format: > > INPUT XML > --------------- > <station_list> > <snets> > <snet id="AZ">AZ (UC San Diego)</snet> > <snet id="BK">BK (UC Berkeley)</snet> > <snet id="CI">CI (CalTech)</snet> > <snet id="IU">IU GSN</snet> > <snet id="NN">NN (UN Reno)</snet> > <snet id="TA">TA (USArray)</snet> > <snet id="US">US ANSS</snet> > <snet id="UU">UUSS (Uni. Utah)</snet> > </snets> > <stations> > <station name="MONP"> > <Network>AZ</Network> > </station> > <station name="BDM"> > <Network>BK</Network> > </station> > <station name="FARB"> > <Network>BK</Network> > </station> > <station name="109C"> > <Network>TA</Network> > </station> > <station name="A05A"> > <Network>TA</Network> > </station> > <station name="Z14A"> > <Network>TA</Network> > </station> > <station name="US"> > <Network>MSTX</Network> > </station> > > ..... [lots of <station> elements, over 600].... > > </stations> > </station_list> > > I want to group the output on the <snet> element id attribute value, moving > all matching <Network> stations into their respective <snet> group. Like the > following format: > > DESIRED OUTPUT XML > ----------------------------- > <kml xmlns:xs="http://www.w3.org/2001/XMLSchema" > xmlns="http://earth.google.com/kml/2.1"> > > <Document> > > <Folder id="AZ"> > <name>AZ (UC San Diego)</name> > <Placemark> > <name>MONP</name> > </Placemark> > </Folder> > > <Folder id="BK"> > <name>BK (UC Berkeley)</name> > <Placemark> > <name>BDM</name> > </Placemark> > <Placemark> > <name>FARB</name> > </Placemark> > </Folder> > > <Folder id="TA"> > <name>TA (USArray)</name> > <Placemark> > <name>109C</name> > </Placemark> > </Folder> > > <Folder id="US"> > <name>ANSS</name> > <Placemark> > <name>MSTX</name> > </Placemark> > </Folder> > > </Document> > > </kml> > > Essentially I want to iterate through the document tree looking for each > <station> <Network> element, then relocating it into the different groups of > <snet>. The following XSLT works for generating the <Folder> elements, but > how do I match the <Network> element value and move them to the correct > <Folder> groups? I have read about <xsl:copy> and <xsl:copy-of>, but can't > seem to figure out how to write an expression that will work. > > XSL > ---- > <?xml version="1.0" encoding="UTF-8"?> > <xsl:stylesheet version="2.0" > xmlns="http://earth.google.com/kml/2.1" > xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > xmlns:xs="http://www.w3.org/2001/XMLSchema"> > > <xsl:output method="xml" indent="yes" > cdata-section-elements="description" /> > > <xsl:template match="/"> > <kml> > <Document> > <xsl:for-each select="station_list/snets/snet"> > <Folder id="{@id}"> > <name><xsl:value-of select="." > /></name> > </Folder> > > <!-- Some sort of xsl:copy-of select > expression to get the matching <station> <Network> values? --> > <!-- Guessing here --> > > <xsl:apply-templates > select="station_list/stations/station/" /> > > </xsl:for-each> > </Document> > </kml> > </xsl:template> > > <xsl:template match="station_list/stations/station/"> > <Placemark> > <name><xsl:value-of select="@name" /></name> > </Placemark> > </xsl:template> > > </xsl:stylesheet> > > > Any help appreciated! I hope I have explained this clearly. I know this is > probably a newbie question, so please bear with me - I only occasionally > dabble in XSL. > > Thanks in advance, > - Rob -- Regards, Mukul Gandhi
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
[xsl] Moving an element to a differ, Rob Newman | Thread | Re: [xsl] Moving an element to a di, Rob Newman |
Re: [xsl] accessing multiple xml do, Stefan Hunziker | Date | [xsl] [XSL] Two "Philisophical" que, Alain |
Month |