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(_at_)ikasle(_dot_)ehu(_dot_)es]
Sent: 02 July 2008 10:22
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
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
--~------------------------------------------------------------------
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail:
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--
--~------------------------------------------------------------------
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--