Subject: Re: building a hierarchical classification out of flat and redundant data
From: David Carlisle <davidc@xxxxxxxxx>
Date: Mon, 24 Jul 2006 12:03:43 +0100
|
This is a grouping problem, in XSLT2 I think you just want
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:strip-space elements="*"/>
<xsl:output indent="yes"/>
<xsl:template match="x" name="group">
<xsl:param name="level" select="1"/>
<xsl:param name="items" select="document"/>
<xsl:for-each-group select="$items" group-by="*[name()=concat('tag',$level)]">
<node id="{current-grouping-key()}" name="{*[name()=concat('tag',$level,'a')]}">
<xsl:call-template name="group">
<xsl:with-param name="level" select="$level+1"/>
<xsl:with-param name="items" select="current-group()"/>
</xsl:call-template>
</node>
</xsl:for-each-group>
</xsl:template>
</xsl:stylesheet>
In XSLT1 you can do the same thing, but just replace for-each-group by
one of the standard XSLT 1 grouping idioms (see faq or Jeni's site)
<x>
<document>
<tag1>3</tag1>
<tag1a>Social Sciences</tag1a>
</document>
<document>
<tag1>3</tag1>
<tag1a>Social Sciences</tag1a>
<tag2>32</tag2>
<tag2a>Politics</tag2a>
</document>
<document>
<tag1>3</tag1>
<tag1a>Social Sciences</tag1a>
<tag2>32</tag2>
<tag2a>Politics</tag2a>
<tag3>326</tag3>
<tag3a>Slavery</tag3a>
</document>
<document>
<tag1>3</tag1>
<tag1a>Social Sciences</tag1a>
<tag2>33</tag2>
<tag2a>Economics</tag2a>
</document>
</x>
$ saxon8 grp2.xml grp2.xsl
<?xml version="1.0" encoding="UTF-8"?>
<node id="3" name="Social Sciences">
<node id="32" name="Politics">
<node id="326" name="Slavery"/>
</node>
<node id="33" name="Economics"/>
</node>
|