xsl-list
[Top] [All Lists]

[xsl] for-each-group dropping one element (my inability to structure a test correctly)

2010-02-07 02:09:57
Hi all,
I have been at this for about six hours.

As written, the style sheet does not produce the element marked "Missing element" in Listing 3 (the output ) and as "Not output" in Listing one (source document). The problem is marked "My problem" in the Listing 2 (style sheet).

I Know that my problem is that I am telling the style sheet to give me only the first <Data> element. What I don't know is how to tell it to give me all of the <Data> elements that meet the <xsl:if> test, but none of the <Data> element that do not meet that test. Or have I just set everything up wrong to start with?

Any help would be appreciated
Mark

Listing 1: Input
<?xml version="1.0" encoding="UTF-8"?>
<List >
   <Item plate="1" position="1">
       <Feature>
           <Location>
               <Element>rays</Element>
           </Location>
           <Data>dot below the rays under TA</Data>
       </Feature>
       <Feature>
           <Location>
               <Element>rays</Element>
               <SubDiv>main</SubDiv>
           </Location>
           <Data>main ray swollen at both ends</Data>
       </Feature>
   </Item>
   <Item plate="2" position="1">
       <Feature>
           <Location>
               <Element>rays</Element>
           </Location>
           <Data>dot below the rays under S</Data> <!-- Not output -->
       </Feature>
   </Item>
   <Item plate="1" position="2">
       <Feature>
           <Location>
               <Element>rays</Element>
               <SubDiv>main</SubDiv>
           </Location>
           <Data>main ray thicker in the middle</Data>
       </Feature>
   </Item>
</List>

Listing 2: Style Sheet
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"; xmlns:xs="http://www.w3.org/2001/XMLSchema"; exclude-result-prefixes="xs" version="2.0">

   <xsl:template match="List">
       <List>
<xsl:for-each-group select="Item/Feature" group-by="Location/Element">
               <xsl:sort select="current-grouping-key()"/>
               <Item>
                   <Feature>
<xsl:copy-of select="Location/Element" copy-namespaces="no"/>

<xsl:if test="not(Location/Element/following-sibling::SubDiv)">
                           <Description>
<xsl:copy-of select="Data" copy-namespaces="no"/><!-- My Problem -->
                              </Description>
                       </xsl:if>

<xsl:for-each-group select="current-group()" group-by="Location/SubDiv">
                           <xsl:sort select="current-grouping-key()"/>
                           <Level1>
<xsl:copy-of select="Location/SubDiv" copy-namespaces="no"/>
                           <Description>
<xsl:copy-of select="current-group()/Data" copy-namespaces="no"/>
                           </Description>
                           </Level1>
                       </xsl:for-each-group>
                   </Feature>
               </Item>
           </xsl:for-each-group>
       </List>
   </xsl:template>
</xsl:stylesheet>

Listing 3: Output
<?xml version="1.0" encoding="UTF-8"?>
<List>
   <Item>
       <Feature>
           <Element>rays</Element>
           <Description>
               <Data>dot below the rays under TA</Data>
<!-- Missing Element: <Data>dot below the rays under S</Data> goes here -->
           </Description>
           <Level1>
               <SubDiv>main</SubDiv>
               <Description>
                   <Data>main ray swollen at both ends</Data>
                   <Data>main ray thicker in the middle</Data>
               </Description>
           </Level1>
       </Feature>
   </Item>
</List>





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

<Prev in Thread] Current Thread [Next in Thread>