[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message]

Grouping but not starting at the first element.

Subject: Grouping but not starting at the first element.
From: "Kerry, Richard" <richard.kerry@xxxxxxxx>
Date: Tue, 2 Oct 2012 15:58:11 +0000
 Grouping but not starting at the first element.
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.kerry@xxxxxxxx
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.

Current Thread

PURCHASE STYLUS STUDIO ONLINE TODAY!

Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!

Buy Stylus Studio Now

Download The World's Best XML IDE!

Accelerate XML development with our award-winning XML IDE - Download a free trial today!

Don't miss another message! Subscribe to this list today.
Email
First Name
Last Name
Company
Subscribe in XML format
RSS 2.0
Atom 0.3
Site Map | Privacy Policy | Terms of Use | Trademarks
Free Stylus Studio XML Training:
W3C Member
Stylus Studio® and DataDirect XQuery ™are products from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2013 All Rights Reserved.