I have a list of spa services, and I need to break them out via groupings, via XSLT 1.0. I can break out the names with grouping, but struggling with my concat of the sub-groups. If you run my script, you'll see my first Muenchian group is working fine, placing the guest names distinctly, but not sure why my second concatenated key is not working (the dates). Can anyone point me int he proper direction? I'm not very skilled with XSLT, but I enjoy trying!
Simplified Input
<SQLXMLExport>
<Rows>
<Row>
<Field alias="BOOK_FOR">Phone, Angie</Field>
<Field alias="START_DATE">Tuesday, December 5, 2017</Field>
<Field alias="ITEM_NAME">Sea Soak</Field>
</Row>
<Row>
<Field alias="BOOK_FOR">Phone, Angie</Field>
<Field alias="START_DATE">Tuesday, December 5, 2017</Field>
<Field alias="ITEM_NAME">Ocean Package - Weekday</Field>
</Row>
<Row>
<Field alias="BOOK_FOR">McNotes, Sue</Field>
<Field alias="START_DATE">Tuesday, December 5, 2017</Field>
<Field alias="ITEM_NAME">Experience Package - Weekday</Field>
</Row>
<Row>
<Field alias="BOOK_FOR">McNotes, Sue</Field>
<Field alias="START_DATE">Tuesday, December 5, 2017</Field>
<Field alias="ITEM_NAME">Morning Soak - Weekday</Field>
</Row>
<Row>
<Field alias="BOOK_FOR">McNotes, Sue</Field>
<Field alias="START_DATE">Wednesday, December 6, 2017</Field>
<Field alias="ITEM_NAME">Test Scrub - Weekday</Field>
</Row>
</Rows>
</SQLXMLExport>
My XSLT 1.0
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html"/>
<xsl:key name="guests" match="Rows/Row" use="./Field[@alias='BOOK_FOR']"/>
<xsl:key name="guests-date" match="Rows/Row" use="concat( ./Field[@alias='BOOK_FOR'] , '|' , ./Field[@alias='START_DATE'] )"/>
<xsl:template match="Rows">
<!-- Now, we need to iterate on the guest key -->
<xsl:for-each select="Row[count(. | key('guests', ./Field[@alias='BOOK_FOR'])[1]) = 1]">
<!-- Sort by the guest -->
<xsl:sort select="./Field[@alias='BOOK_FOR']" />
<br/><xsl:value-of select="./Field[@alias='BOOK_FOR']" />
<hr />
<!-- Now loop on the items of this guest, we get them from the key we defined -->
<xsl:for-each select="Row[count(. | key( 'guests-date' , concat(./Field[@alias='BOOK_FOR'] , '|' , ./Field[@alias='START_DATE'] ) )[1]) = 1]">
<!-- Sort by the start date -->
<!-- year -->
<xsl:sort select="substring-after(substring-after(./Field[@alias='START_DATE'],','), ',')" order="ascending" data-type="number" />
<!-- day -->
<xsl:sort select="substring-after(substring-after(substring-before(substring-after(./Field[@alias='START_DATE'],','), ','), ' '), ' ' )" order="ascending" data-type="number" />
<!-- month...this is a mess, tackle later
<xsl:sort select="substring-before(substring-after(./Field[@alias='START_DATE'],','), ' ')" order="ascending" data-type="number" />
-->
<xsl:value-of select="./Field[@alias='START_DATE']" /><br/>
<xsl:value-of select="./Field[@alias='ITEM_NAME']" /><br/>
</xsl:for-each>
<br />
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Desired output
I'd like to get it where name is first, then under each name are the days they are coming, with their services listed under each respective date. Like this sample below:
McNotes, Sue
<hr>
<b>Tuesday, December 5, 2017</b><br>
Experience Package - Weekday<br>
Morning Soak - Weekday<br>
<b>Wednesday, December 6, 2017</b>
Test Scrub - Weekday<br>
Phone, Angie
<hr>
<b>Tuesday, December 5, 2017</b><br>
Sea Soak<br>
Ocean Package - Weekday<br>