Re: [xsl] building a hierarchical classification out of flat and redundant data

Subject: Re: [xsl] 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>

Current Thread