|
Subject: RE: [xsl] group by tags From: "Michael Kay" <mike@xxxxxxxxxxxx> Date: Wed, 2 Jul 2008 10:57:13 +0100 |
A bit tricky, this one!
I think I would tackle it by first flattening the structure into something
like this:
<Book rdf:ID="boo2">
<address rdf:dataytpe="aaa" path="">Almogavers 56</address>
<month rdf:dataytpe="bbb" path="event/Inbook">July</month>
<year rdf:dataytpe="ccc" path="event/Inbook">2006</year>
<year rdf:dataytpe="ddd" path="proceedings/Proceedings">2008</year>
<month rdf:dataytpe="ddd" path="proceedings/Proceedings">May</month>
etc.
That part can be done by
<xsl:for-each select="//*[not(*)]">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:attribute name="path" select="string-join(ancestor::*/name(),
'/')"/>
</xsl:copy>
</xsl:for-each>
Then you can construct the output with
<xsl:for-each-group select="*" group-by="@path">
<xsl:sequence select="f:nest(tokenize(@path, '/'), current-group())"/>
</xsl:for-each>
using the recursive function
<xsl:function name="f:nest" as="element()*">
<xsl:param name="path" as="xs:string*"/>
<xsl:param name="content" as="element()*"/>
<xsl:choose>
<xsl:when test="exists($path)">
<xsl:element name="{$path[1]}">
<xsl:sequence select="f:nest(remove($path, 1), $content)"/>
</xsl:element>
</xsl:when>
<xsl:otherwise>
<xsl:sequence select="$content"/>
</xsl:otherwise>
</xsl:choose>
</xsl:function>
Not tested. Needs refinement if namespaces are involved.
Michael Kay
http://www.saxonica.com/
> -----Original Message-----
> From: IZASKUN GUTIERREZ GUTIERREZ
> [mailto:igutierrez027@xxxxxxxxxxxxx]
> Sent: 02 July 2008 10:22
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: [xsl] group by tags
>
> Hello everybody!
>
> I need group by tags this xml for example. The problem is
> that I dont know the name of the tags. Only I know the tag
> "Book" and the ID "boo2". I dont know too the extension of de
> levels of the subtrees, but the groupment must be make by the
> tags that are writed in lowercase, and only group by tags
> writed in upperecase if the tags are the same. (I dont
> control all of the data). I need one generic template .
>
>
> <?xml version="1.0"?>
> <rdf:RDF xmlns:foaf="http://xmlns.com/foaf/0.1/"
> xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
>
> <Book rdf:ID="boo2">
> <address rdf:dataytpe="aaa">Almogavers 56</address>
>
> <event>
> <Inbook>
> <month rdf:dataytpe="bbb">July</month>
> </Inbook>
> </event>
> <event>
> <Inbook>
> <year rdf:dataytpe="ccc">2006</year>
> </Inbook>
> </event>
>
> <proceedings>
> <Proceedings>
> <year rdf:dataytpe="ddd">2008</year>
> </Proceedings>
> </proceedings>
> <proceedings>
> <Misc>
> <month rdf:dataytpe="ddd">May</month>
> </Misc>
> </proceedings>
>
> <art>
> <Manual>
> <man>
> <Article>
> <month rdf:dataytpe="nnn">September</month>
> </Article>
> </man>
> <city rdf:dataytpe="ppp">September</city>
> </Manual>
> </art>
> <art>
> <Manual>
> <man>
> <Article>
> <year rdf:dataytpe="eee">2004</year>
> </Article>
> </man>
> </Manual>
> </art>
>
>
> </Book>
>
> </rdf:RDF>
>
>
>
> I want this result:
>
> <?xml version="1.0"?>
> <rdf:RDF xmlns:foaf="http://xmlns.com/foaf/0.1/"
> xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
> <Book rdf:ID="boo2">
> <address rdf:dataytpe="aaa">Almogavers 56</address>
>
> <event>
> <Inbook>
> <month rdf:dataytpe="bbb">July</month>
> <year rdf:dataytpe="ccc">2006</year>
> </Inbook>
> </event>
>
>
> <proceedings>
> <Proceedings>
> <year rdf:dataytpe="ddd">2008</year>
> </Proceedings>
> <Misc>
> <month rdf:dataytpe="ddd">May</month>
> </Misc>
> </proceedings>
>
> <art>
> <Manual>
> <man>
> <Article>
> <month rdf:dataytpe="nnn">September</month>
> <year rdf:dataytpe="eee">2004</year>
> </Article>
> </man>
> <city rdf:dataytpe="ppp">September</city>
> </Manual>
> </art>
>
>
> </Book>
>
> </rdf:RDF>
>
>
>
> Anybody can help me ?
>
> Thank you, Regards
>
> IZASKUN
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| [xsl] group by tags, IZASKUN GUTIERREZ GU | Thread | Re: [xsl] group by tags, Dave Pawson |
| [xsl] group by tags, IZASKUN GUTIERREZ GU | Date | [xsl] invalid xpath?, Trevor Nicholls |
| Month |