xsl-list
[Top] [All Lists]

[xsl] two level grouping problem

2007-10-25 13:20:12
I am trying to group down to two levels. Here is a sample of the original xml (blank lines added for clarity):

<state>
<standard><g_code>G4U1S01</g_code>
<state-objective state="AL">R.3.6. Blah blah blah</state-objective></ standard>

<standard><g_code>G4U1S01</g_code>
<state-objective state="AK">[4] 2.1.4. Blah blah blah</state- objective></standard>

<standard><g_code>G4U1S01</g_code>
<state-objective state="AK">[4] 2.1.2. Blah blah blah</state- objective></standard>

<standard><g_code>G4U1S01</g_code>
<state-objective state="AK">[4] 2.1.1. Blah blah blah</state- objective></standard>

<standard><g_code>G4U1S02</g_code>
<state-objective state="AL">R.3.7. Blah blah blah</state-objective></ standard>
. . . .
</state>

Here is what I am looking for. Notice that the g_codes have been grouped and the AK objectives have been groups together separated by a pipe character.

<standard>
<g_code>G4U1S01</g_code>
<state-objective state="AL">R.3.6. Blah blah blah </state-objective>
<state-objective state="AK">[4] 2.1.4. Blah blah blah | [4] 2.1.2. Blah blah blah | [4] 2.1.1. Blah blah blah</state-objective>
</standard>

My current XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/ Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>


<xsl:key name="gcode_key" match="standard" use="g_code"/>
<xsl:key name="state_by_gcode" match="standard" use="concat(., '+', / standard/state-objective/@state)" />


<xsl:template match="/">
<xsl:for-each select="/state/standard[generate-id(.)=generate-id(key ('gcode_key' , g_code))]/g_code">
 <xsl:sort/>

<xsl:text>&#10;</xsl:text><standard><g_code><xsl:value-of select="."/ ></g_code><xsl:text>&#10;</xsl:text>

    <xsl:for-each select="key('gcode_key', .)
                  [generate-id() =
                 generate-id(key('state_by_gcode',
                                 concat(., '+', @state))[1])]">
                                 <xsl:sort select="@state"/>
<xsl:copy-of select="state-objective" /><xsl:text>&#10;</ xsl:text>
      </xsl:for-each>
</standard>
 </xsl:for-each>
</xsl:template>

</xsl:stylesheet>

It produces the following output:

<standard><g_code>G4U1S01</g_code>
<state-objective state="AL">R.3.6. Blah blah blah</state-objective>
<state-objective state="AK">[4] 2.1.4.Blah blah blah</state-objective>
<state-objective state="AK">[4] 2.1.2. Blah blah blah</state-objective>
<state-objective state="AK">[4] 2.1.1. Blah blah blah</state-objective>
<state-objective state="AZ">R04-S1C4-02. Blah blah blah</state- objective>
. . .
</standard>

Apparently my first group key is working. I am not sure what the second one is doing, if anything. Can anyone show me where I am going wrong?

Thanks in advance.

Terry Ofner


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