Perhaps you could replace
xsl:for-each group group-starting-with="*[(_at_)StyleName='DIVISION']"
with
xsl:variable name="next" select="*[1]/@StyleName"
xsl:for-each-group group-starting-with="*[(_at_)StyleName=$next]"
This also has the advantage that it's the same code at all levels.
Michael Kay
-----Original Message-----
From: owner-xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
[mailto:owner-xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com] On Behalf Of
Mark Brand
Sent: 07 August 2003 10:41
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: Re: [xsl] XSLT 2.0 & Grouping for-each-group - RESEND
* Micheal Kay
<snip>
But I may have misunderstood the requirement. What do you
want to happen if there isn't a DIVISION item in the group? </snip>
* Mark Brand
Hi Michael
Thanks for the response, the incoming data will follow the
hierachy below (Figure 1) and for this case the nested
for-each-group works well.
But the only guarentee about the data is the order. It is
not guarenteed that a particular level will be there. For
example, a SUB-DIVISION level may be missing as per (Figure 2).
The nested for-each-group solution for the SUB-DIVISION
level ignores the fact that there is no SUB-DIVISION entry in
the group and processes the group entries anyway.
I thought I could get around this with a check on the
for-each-group to see if (for example) the SUB-DIVISION level
was in the current-group(), but that won't work because you
still need to process the for-each-group because of the down
level stuff.
Another issue is that, there are some other elements that are
not part of the hierachy but can appear before or after any
of the hierachial elements. For example (Figure 3) you may
have a <NOTE> after a <DIVISION>
<PART>
<DIVISION>
<NOTE/>
<REGULATION>
<NOTE/>
</REGULATION>
</DIVISION>
</PART>
(Figure 1)
PART
DIVISION
SUBDIVISION
REGULATION
SUBREGULATION
PARAGRAPH
SUB-PARAGRAPH
SUB-SUB-PARAGRAPH
(Figure 2)
PART
DIVISION
REGULATION
SUBREGULATION
PARAGRAPH
SUB-PARAGRAPH
SUB-SUB-PARAGRAPH
(Figure 3)
<PART>
<DIVISION>
<NOTE/>
<REGULATION>
<NOTE/>
</REGULATION>
</DIVISION>
</PART>
Thanks Mark Brand
Michael Kay wrote:
* Mark Brand
Hi
I have further questions on the fragments posted earlier. I
did try implementing both options
but had some questions ...
Q1.
<snip>
<xsl:for-each-group select="current-group() except "."
group-starting-with="*[(_at_)StyleName='DIVISION']">
</snip>
With this line of code, i found that it would execute (enter
the for-each-group
loop) even if there wasn't a DIVISION item in the group. How
do I stop the loop being entered if the group-starting-with
entry is not in the list. I have tried an if statement after
the loop has been entered but it is too late then for my purposes.
This reads to me like
<xsl:if test="current-group()/*[(_at_)StyleName='DIVISION']">
<xsl:for-each-group select="current-group() except "."
group-starting-with="*[(_at_)StyleName='DIVISION']">
...
</xsl:if>
But I may have misunderstood the requirement. What do you want to
happen if there isn't a DIVISION item in the group?
Q2.
<snip>
<Part Category="{(_at_)StyleName}">
<xsl:copy-of select="child::node()"/>
<xsl:for-each-group select="current-group() except ."
group-starting-with="*[(_at_)StyleName=f:child(@StyleName)]">
<xsl:apply-templates select="."/>
</snip>
With this piece of code from the second option where would
you put the closing tags,
where-ever i put them they would all output after everything
else instead of in a nested fashion.
Clearly the XSLT must be well-formed XML, so the closing
tags have to
be properly nested, and they will then also be properly
nested in the
result document. In fact, it's impossible to output a
document in which
the tags aren't properly nested! So I don't think I understand the
question.
Michael Kay
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list