xsl-list
[Top] [All Lists]

[xsl] for-each-group grouping accented versions of letters together

2012-04-20 19:04:08
So I've got an XML index file, which is too large for some downstream
processing to be entirely pleased with.  The requirement is to split the
file up, grouping index entries (index-0 elements; the index element is
the overall container element) by the first character of their child
heading element.

Using XSLT 2.0, this is pretty easy:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet exclude-result-prefixes="xs xd" version="2.0"
  xmlns:xd="http://www.oxygenxml.com/ns/doc/xsl";
  xmlns:xs="http://www.w3.org/2001/XMLSchema";
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
  <xsl:template match="/wkna-shared-cms/index">
    <xsl:for-each-group group-by="substring(heading,1,1)" select="index-0">
      <xsl:sort select="./heading"/>
      <xsl:result-document 
href="eitaindex+Topical_Index_{current-grouping-key()}.xml">
        <wkna-shared-cms>
          <index area="{/wkna-shared-cms/index/@area}"
            xml:lang="{/wkna-shared-cms/index/@xml:lang}">
            <num cite="Topical Index {current-grouping-key()}">
              <xsl:sequence select="current-grouping-key()"/>
            </num>
            <xsl:copy-of select="/wkna-shared-cms/index/index-metadata"/>
            <xsl:copy-of select="current-group()"/>
          </index>
        </wkna-shared-cms>
      </xsl:result-document>
    </xsl:for-each-group>
  </xsl:template>
</xsl:stylesheet>

The problem is that some of the initial characters of the headings have
accents, and it's desired that the accented characters and the
unaccented characters group together, so that E and É and Ê, etc. all
group together in a group with a current-grouping-key() of "E".

I can imagine doing this in a painful way with conditional statements
and an exhaustive list of characters, but I'm hoping someone can tell me
there's a better way.

Thanks!

-- Graydon

--~------------------------------------------------------------------
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>
--~--