xsl-list
[Top] [All Lists]

[xsl] Grouping but not starting at the first element.

2012-10-02 10:59:17

I have a problem involving groups.  With the advice of the List a few weeks ago 
I managed to make a lot of progress on solving a problem by using XSLT groups.  
I'm now back on the issue and have a supplementary problem I need to solve.

My input XML is shown below.  It represents part of an Excel spreadsheet, hence 
the references to rows and columns.

<sheet>
<row row="1">
<column column="1" cell="A1">DDF</column>
<column column="2" cell="B1">AT3G_UP_DN</column>
</row>
<row row="2">
<column column="1" cell="A2">id</column>
<column column="2" cell="B2">name</column>
<column column="3" cell="C2">type</column>
<column column="4" cell="D2">class</column>
<column column="5" cell="E2">caption</column>
<column column="6" cell="F2">value</column>
</row>
<row row="3">
<column column="1" cell="A3">1</column>
<column column="2" cell="B3">Card fail</column>
<column column="3" cell="C3">integer</column>
<column column="4" cell="D3">enum</column>
</row>
<row row="4">
<column column="1" cell="A4"></column>
<column column="2" cell="B4"></column>
<column column="3" cell="C4"></column>
<column column="4" cell="D4"></column>
<column column="5" cell="E4">Card Fail</column>
<column column="6" cell="F4">0</column>
</row>
<row row="5">
<column column="1" cell="A5"></column>
<column column="2" cell="B5"></column>
<column column="3" cell="C5"></column>
<column column="4" cell="D5"></column>
<column column="5" cell="E5">Card OK</column>
<column column="6" cell="F5">1</column>
</row>
<row row="6">
<column column="1" cell="A6">2</column>
<column column="2" cell="B6">SD-SD ARC bypass</column>
<column column="3" cell="C6">integer</column>
<column column="4" cell="D6">enum</column>
</row>
<row row="7">
<column column="1" cell="A7"></column>
<column column="2" cell="B7"></column>
<column column="3" cell="C7"></column>
<column column="4" cell="D7"></column>
<column column="5" cell="E7">Normal</column>
<column column="6" cell="F7">0</column>
</row>
<row row="8">
<column column="1" cell="A8"></column>
<column column="2" cell="B8"></column>
<column column="3" cell="C8"></column>
<column column="4" cell="D8"></column>
<column column="5" cell="E8">Bypass</column>
<column column="6" cell="F8">1</column>
</row>
</sheet>

Rows 1 and 2 are headings.  
The subsequent rows are in groups.  
Row 3 (with columns 1 to 4) starts a group.  This will generate an "item" 
element.
Rows 4 and 5 have columns 5 and 6, and end up as "sub-item" elements which are 
children of the most recent "item".
The same relationship holds between row 6 and its children in rows 7 and 8.  ie 
6 should generate an "item" and 7 and 8 "sub-item" children.


My stylesheet looks like this :

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
<xsl:output method="xml" indent="yes" />
<xsl:template match="sheet">
<page>
<xsl:for-each-group select="row" group-starting-with="row[column[1][. != '']]" >
<item name="{column[2]}" row="{@row}" >
<xsl:apply-templates select="current-group()" mode="col-1">
</xsl:apply-templates>
</item>
</xsl:for-each-group>
</page>
</xsl:template>
<!-- row process. Called on row within group. -->
<xsl:template match="row" mode="col-1" >
<xsl:if test="normalize-space(column[5])" >
<sub-item caption="{column[5]}" value="{column[6]}" />
</xsl:if>
</xsl:template>
</xsl:stylesheet>

So I'm grouping based on starting with rows with column[1] not empty.

The result I get is :
<?xml version="1.0" encoding="UTF-8"?>
<page>
<item name="AT3G_UP_DN" row="1"/>
<item name="name" row="2">
<sub-item caption="caption" value="value"/>
</item>
<item name="Card fail" row="3">
<sub-item caption="Card Fail" value="0"/>
<sub-item caption="Card OK" value="1"/>
</item>
<item name="SD-SD ARC bypass" row="6">
<sub-item caption="Normal" value="0"/>
<sub-item caption="Bypass" value="1"/>
</item>
</page>

I understand why I get this.  What I'd like to do is get rid of the items 
generated by rows 1 and 2.
These rows represent headings or control information and don't want to get into 
the result.

The logic would appear to be something like group-starting-with row[column[1][. 
!= '']] except for rows 1 and 2.
If this was not using groups I'd just set up a couple of no output templates 
for row[1] and row[2], but I'm using a template matching on "sheet" and 
scanning the rows using groups so I can't do that (can I ?).

Can anyone advise how to go about achieving this ?  Do I need to add something 
to the group spec ?  Do I need to add another template to swallow the unwanted 
rows, and if so how, given that the rows are being processed in groups ?

Appreciatively,
Richard.




Richard Kerry
BNCS Engineer
T: +44 (0)20 82259063 
M: +44 (0)7812 325518
Room EBX 301, BBC Television Centre, Wood Lane, London, W12 7RJ
richard(_dot_)kerry(_at_)atos(_dot_)net
uk.atos.net

This e-mail and the documents attached are confidential and intended solely for 
the addressee; it may also be privileged. If you receive this e-mail in error, 
please notify the sender immediately and destroy it. As its integrity cannot be 
secured on the Internet, the Atos group liability cannot be triggered for the 
message content. Although the sender endeavours to maintain a computer 
virus-free network, the sender does not warrant that this transmission is 
virus-free and will not be liable for any damages resulting from any virus 
transmitted.

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