xsl-list
[Top] [All Lists]

Re: XSLT 2.0 & Grouping for-each-group - RESEND

2003-08-07 02:41:29
* 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