[Home] [By Thread] [By Date] [Recent Entries]
Hi,
The style sheet in Listing 2 is a modification of the nested for-each-group example in Michael Kay's 4th ed. When a <SubHeading> element is present, all goes well, but when there is no <SubHeading>, the sequence constructor following the nested for-each-group is, of course, not executed. Any <Heading> that gets grouped with <Items> where some have a <SubHeading> and others do not, fails to execute the nested sequence constructor. I tried an xsl:choose construct testing for a <SubHeading> and branching around the nested for-each group [putting the xsl:sorts and <Article> sequence constructor in both paths], but could not make that work either. This time, any <Heading> that gets grouped with <Items> where some have a <SubHeading> and others do not, fails to produce the <SubHeading> when it is present but did execute the sequence constructors plated in both paths. I have a clue what is wrong (the groups), but not a clue about fixing it. Thanks, Mark Listing 1: data. <List> <Item> <Heading entry="subject">Catalogs</Heading> <SubHeading>Czechoslovakia</SubHeading> <Article> <Title>2007 - Ceskoslovensko 1918-1939 -POFIS</Title> <Person>Benes, Frantisek.</Person> <Person>Horvath, Savoy [reviewer]</Person> <IssueName>Nov/Dec</IssueName> <Year>2007</Year> <IssueNumber>6</IssueNumber> <Page>22</Page> </Article> </Item> <Item> <Heading entry="subject">Catalogs</Heading> <Article> <Title>Comparison survey of catalog numbers of Czechoslovak postage stamps (cont)</Title> <Person>Horvath, Savoy</Person> <IssueName>Jul/Aug</IssueName> <Year>2003</Year> <IssueNumber>4</IssueNumber> <Page>18</Page> </Article> </Item> </List> Listing 2: style sheet <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html" indent="yes"/> <xsl:strip-space elements="*"/> <xsl:template match="List">
<List>
<!-- There is always a Heading element --> <xsl:for-each-group select="Item" group-by="Heading">
<xsl:sort select="current-grouping-key()"/>
<Item>
<xsl:element name="Heading">
<xsl:attribute name="entry">
<xsl:value-of select="Heading/@entry"/>
</xsl:attribute>
<xsl:value-of select="current-grouping-key()"/>
</xsl:element><!-- Here is my nesting problem: the SubHeading element may not always be present --> <xsl:for-each-group select="current-group()" group-by="SubHeading"> <xsl:sort select="current-grouping-key()"/> <xsl:element name="SubHeading"> <xsl:value-of select="current-grouping-key()"/> </xsl:element> <!-- the following sequence constructor needs to be executed whether or not there is a <SubHeading> --> <xsl:for-each select="current-group()">
<xsl:sort select="Title"/>
<xsl:sort select="Year"/>
<xsl:sort select="IssueNumber"/>
<xsl:sort select="Page"/>
<Article>
<xsl:apply-templates/>
</Article>
</xsl:for-each>
</xsl:for-each-group>
</Item>
</xsl:for-each-group>
</List>
</xsl:template><!-- Pass these through --> <xsl:template match="Title"><xsl:copy-of select="."/></xsl:template> <xsl:template match="Year"><xsl:copy-of select="."/></xsl:template> <xsl:template match="IssueName"><xsl:copy-of select="."/></xsl:template> <xsl:template match="Person"><xsl:copy-of select="."/></xsl:template> <xsl:template match="Page"><xsl:copy-of select="."/></xsl:template> <!-- Discard or reformat these --> <xsl:template match="Heading "/> <xsl:template match="SubHeading" /> <xsl:template match="IssueNumber"/> </xsl:stylesheet>
|

Cart



