[XSL-LIST Mailing List Archive Home] [By Thread] [By Date]

Re: [xsl] Group by Element based on Attribute inside container using 1.0


Subject: Re: [xsl] Group by Element based on Attribute inside container using 1.0
From: Michael Ludwig <mlu@xxxxxxxxxxxxx>
Date: Thu, 06 Nov 2008 19:29:44 +0100

Friend, Darris E schrieb:
I am using 1.0 and can not use 2.0. [...] I can not alter the XML
output/format.

The verbosity and redundancy of the XML vocabulary you have to deal with makes this a bit tedious.

The following produces more or less the desired output:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="text"/>

 <xsl:key
  name="valves-by-number"
  match="ObjectClassField[ @name = 'Valve Number']"
  use="."/>

 <xsl:key
  name="inspections-by-valve-number"

match="GeodatabaseRelationships/ObjectClass/ObjectClassRows/ObjectClassRow"
  use="ObjectClassField[ @name = 'Valve Number']"/>

 <xsl:template match="/">
  <xsl:for-each select="
   /*/*/GeodatabaseRelationships
   //ObjectClassField[ @name = 'Valve Number']">
   <xsl:sort select="." data-type="number"/>
   <xsl:if test="
    generate-id() =
    generate-id( key( 'valves-by-number', .)[1])">
    <xsl:text>Valve Number: </xsl:text>
    <xsl:value-of select="."/>
    <xsl:text>&#10;</xsl:text>
    <!-- inspections -->
    <xsl:for-each select="key( 'inspections-by-valve-number', .)">
     <xsl:sort select="concat(
      substring( ObjectClassField[ @name = 'Date Inspected'], 6, 4),
      substring( ObjectClassField[ @name = 'Date Inspected'], 1, 2),
      substring( ObjectClassField[ @name = 'Date Inspected'], 4, 2))"/>
     <xsl:apply-templates select="."/>
    </xsl:for-each>
   </xsl:if>
  </xsl:for-each>
 </xsl:template>

 <xsl:template match="ObjectClassRow">
  <!-- Extend this to display more information. -->
  <xsl:value-of select="ObjectClassField[ @name = 'Date Inspected']"/>
  <xsl:text>&#10;</xsl:text>
 </xsl:template>

</xsl:stylesheet>

I would be nice to be able to use a variable in the xsl:sort that
rearranges the date as in:

<xsl:variable
 name="d" select="ObjectClassField[ @name = 'Date Inspected']"/>
<xsl:sort select="concat( substring( $d, 6, 4)), ... "/>

But that is not possible. If MSXML for IE6 has EXSLT or another
extension function facility, you could use that to write a function
to rearrange the date and then sort by select="my:iso-date( $d)".

Michael Ludwig


Current Thread
Keywords
xml