xsl-list
[Top] [All Lists]

[xsl] Return text contents of most recent non-null sibling.

2012-08-14 11:04:24

I'm sure this should be straightforward but I can't seem to make it work ...

I have Xml corresponding to part of a spreadsheet, like this :

<sheet name="sheet-1" >
<row row="6">
<column column="1" cell="A6">Reference Present</column>
<column column="2" cell="B6">1,2</column>
<column column="3" cell="C6">1=missing</column>
</row>

<row row="7">
<column column="1" cell="A7"/>
<column column="2" cell="B7"/>
<column column="3" cell="C7">2=present</column>
</row>

<row row="8">
<column column="1" cell="A8">Reference Standard</column>
<column column="2" cell="B8">0-11</column>
<column column="3" cell="C8">0=missing</column>
</row>

<row row="9">
<column column="1" cell="A9"/>
<column column="2" cell="B9"/>
<column column="3" cell="C9">1=525</column>
</row>

<row row="10">
<column column="1" cell="A10"/>
<column column="2" cell="B10"/>
<column column="3" cell="C10">2=625</column>
</row>
</sheet>

The situation is that there are headings that I want to be repeating in my 
result that aren't repeated in this source.  In particular the column 1 text, 
which is only present in cells A6 and A8 here.

The result I want is as follows:

<result name="sheet-1" >
<item row="6" name="Reference Present" value="1=missing" />
<item row="7" name="Reference Present" value="2=present" />
<item row="8" name="Reference Standard" value="0=missing" />
<item row="9" name="Reference Standard" value="1=525" />
<item row="10" name="Reference Standard" value="2=625" />
</result>

The text from cell=A6 has been copied to the new item corresponding to row 7, 
and that from cell=A8 copied to the items corresponding to rows 9 and 10.

At the moment I've got the following template in my stylesheet :

<xsl:template match="row">
<xsl:choose>
<xsl:when test="column[1]/text()" >
<test heading="{column[1]}" type="present" value="{column[3]}" />
</xsl:when>
<xsl:otherwise>
<test heading="{preceding-sibling::node()[column[1]][1]/column[1]}" 
type="absent" value="{column[3]}" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>

For each "row", if there is text in column[1] then it generates output with 
type=present.  
If there is no text in column[1] then the text from the nearest non-empty 
preceding row/column[1] should be used, and type=absent.

But that gives the following output.

<test heading="Reference Present" type="present" value="1=missing"/>
<test heading="Reference Present" type="absent" value="2=present"/>
<test heading="Reference Standard" type="present" value="0=missing"/>
<test heading="Reference Standard" type="absent" value="1=525"/>
<test heading="" type="absent" value="2=625"/>

So, if the heading was present, it's coming through as required.
If it is absent on the current row, it is only coming through once, and I want 
it to come through every time.

My selection is preceding-sibling::node()[column[1]][1]/column[1].

By this I mean "find the nearest preceding sibling with something in column1" - 
preceding-sibling::node()[column[1]]
return the first item in this seqnence - [1]
return the whole of column 1 of it - /column[1]

Can someone advise what I'm getting wrong here.  I have tried a selection of 
simimlar options, with and without various [1]'s for example, but was rather 
finding I was trying things randomly rather than understanding what I was doing.

Puzzledly,
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 <http://uk.atos.net/en-uk/> 

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>