Subject: Re: [xsl] for-each-group dropping one element (my inability to structure a test correctly) From: Wolfgang Laun <wolfgang.laun@xxxxxxxxx> Date: Sun, 7 Feb 2010 09:41:23 +0100 |
Not being sure what your requirements are, I've found that this change, as close to the original solution, does the trick: ... <xsl:copy-of select="Location/Element" copy-namespaces="no"/> <Description> <xsl:for-each select="current-group()"> <xsl:if test="not(Location/Element/following-sibling::SubDiv)"> <xsl:copy-of select="Data" copy-namespaces="no"/> </xsl:if> </xsl:for-each> </Description> <xsl:for-each-group select="current-group()" group-by="Location/SubDiv"> ... -W On Sun, Feb 7, 2010 at 9:09 AM, Mark Wilson <mark@xxxxxxxxxxxx> wrote: > > 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>
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
[xsl] for-each-group dropping one e, Mark Wilson | Thread | Re: [xsl] for-each-group dropping o, Mark Wilson |
Re: [xsl] XML to SVG via XSLT 2.0, Dave Pawson | Date | Re: [xsl] for-each-group dropping o, Mark Wilson |
Month |