This is the mail archive of the
xsl-list@mulberrytech.com
mailing list .
RE: xml to xml transform
- To: "'xsl-list at lists dot mulberrytech dot com'" <xsl-list at lists dot mulberrytech dot com>
- Subject: RE: [xsl] xml to xml transform
- From: Shimon Pozin <spozin at broadbase dot com>
- Date: Tue, 16 Jan 2001 13:46:22 -0500
- Reply-To: xsl-list at lists dot mulberrytech dot com
Thanks, Mike, for the clue. However, when I tested
this solution, I paid attention that if the source
xml is slightly different:
<rows>
<row fld="f1" value="v1"/>
<row fld="f1" value="v2"/>
<row fld="f2" value="v3"/>
<row fld="f1" value="v2"/>
<row fld="f3" value="v4"/>
</rows>
then this solution will not work since f1 comes after f2
and in this case I'll see two elements f1 rather than one.
Should I sort the entire collection before I use this
solution? Can I use sorting capabilities of apply-templates
for that?
Thanks again!
Shimon
> -----Original Message-----
> From: Mike Brown [mailto:mike@skew.org]
> Sent: Monday, January 15, 2001 10:54 PM
> To: xsl-list@lists.mulberrytech.com
> Cc: spozin@broadbase.com
> Subject: Re: [xsl] xml to xml transform
>
>
> Shimon Pozin wrote:
> > How can I transform document:
> > <row @fld="f1" value="v1">
> > <row @fld="f1" value="v2">
> > <row @fld="f2" value="v3">
> > <row @fld="f3" value="v4">
>
> This isn't even XML.
> I will answer your question based on the assumption that you meant:
>
> <rows>
> <row fld="f1" value="v1"/>
> <row fld="f1" value="v2"/>
> <row fld="f2" value="v3"/>
> <row fld="f3" value="v4"/>
> </rows>
>
> > to
> >
> > <f1>
> > <v1/>
> > <v2/>
> > </f1>
> > <f2>
> > <v3/>
> > </f2>
> > <f3>
> > <v4/>
> > </f3>
> >
> > if I don't know values f1, f2, etc. in advance?
>
> This is a fun (fun in a pathetically geeky way) variation on
> the grouping
> FAQ. There is a design pattern for this. In your case it is along the
> lines of the following:
>
> 1. id a node-set representing the unique values from all the @fld
> attributes (one f1, one f2, one f3...). create an element with
> a name that is the same as the value. in the content of that
> element...
> 2. iterate through that set, finding the rest of the @fld
> values that
> have the current value (all f1s, all f2s, all f3s...).
> There's your
> group. All you have to do is...
> 3. Iterate through those (or in this case, through the corresponding
> @value attributes) and create elements named for their values.
>
> <?xml version="1.0" encoding="utf-8"?>
> <xsl:stylesheet
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
>
> <xsl:output method="xml" indent="yes"/>
>
> <xsl:template match="rows">
> <xsl:for-each select="row[not(@fld =
> preceding-sibling::row/@fld)]">
> <xsl:element name="{@fld}">
> <xsl:for-each select="../row[@fld = current()/@fld]">
> <xsl:element name="{@value}"/>
> </xsl:for-each>
> </xsl:element>
> </xsl:for-each>
> </xsl:template>
>
> </xsl:stylesheet>
>
> - Mike
> ____________________________________________________________________
> Mike J. Brown, software engineer at My XML/XSL resources:
> webb.net in Denver, Colorado, USA http://skew.org/xml/
>
>
> XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
>
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list