Re: [xsl] problems with position() and following-sibling

Subject: Re: [xsl] problems with position() and following-sibling
From: Georges Schmitz <georges.schmitz@xxxxxxxxx>
Date: Fri, 12 Aug 2005 14:26:34 +0200
Thanks for your reply Prakash, but it does not work; especially footnote is not processed conditionally...

Nevertheless, you made me think of using the axis specifier parent:: which makes things clearer when it comes to test the existence of cell 7 (in my previous post, I omitted namespace prefix "e" to make the example more readable).

<xsl:template match="e:Cell[position() &gt; 1 and position() &lt; 7]">
<xsl:message>* current pos <xsl:value-of select="position()"/> *</xsl:message>
<entry>
<xsl:value-of select="e:Data"/>
<xsl:if test="position()=6 and parent::e:Row/e:Cell[7]">
<xsl:message>+++ making footnote at pos <xsl:value-of select="position()"/> +++</xsl:message>
<footnote><para><xsl:value-of select="parent::e:Row/e:Cell[7]/e:Data"/></para></footnote>
</xsl:if>
</entry>
</xsl:template>


I was still hunting the cause, why the test for position 3 didn't work and introduced some debug messages as shown above. Surprisingly, I got the following output in my log (in case the stylesheet hits cell 7):

* current pos 4 *
* current pos 6 *
+++ making footnote at pos 6 +++
* current pos 8 *
* current pos 10 *
* current pos 12 *

Where does the doubling of the position number come from? No wonder my attempt for testing node number 3 (also in the way I tried it in my previous post with following-sibling) had no chance to work. The values of current position (in my example) are a complete mystery to me.

Any further explanation is very welcome!
Georges

omprakash.v@xxxxxxxxxxxxx schrieb:




Hi Georges,


You can use this stylesheet to achieve what you want.


<?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"; xmlns:lhp="hhscors">

<xsl:output method="html"/>

<xsl:template match="/Row">

<xsl:apply-templates select="Cell"/>

</xsl:template>

<xsl:template match="Cell">

<xsl:choose>
<xsl:when test="position() = 2">
<entry>
<xsl:value-of select="."/>
</entry>
</xsl:when>
<xsl:when test="position() = 3">
<entry>
<xsl:value-of select="."/>
<footnote>
<para>
<xsl:apply-templates select="parent::Row/*[self::Cell][position() = 7]"
mode="ahead"/>
</para>
</footnote>
</entry>
</xsl:when>

<xsl:when test="position() = 7">
</xsl:when>
<xsl:when test="position() &gt; 2 and position() &lt; 6">
<entry>
<xsl:value-of select="."/>
</entry>
</xsl:when>
</xsl:choose>

</xsl:template>


<xsl:template match="Cell" mode="ahead"> <xsl:value-of select="."/> </xsl:template>

</xsl:stylesheet>
<!-- END xsl -->



Cheers,
prakash



Georges Schmitz <georges.schmitz To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx @heitec.de> cc: (bcc: omprakash.v/Polaris) Subject: [xsl] problems with position() and following-sibling 08/12/2005 02:07 PM Please respond to xsl-list




My use case:


I have an Excel Sheet in xml format, that is basically build out of 6
columns. Now and then I have a value in column 7, that should be made a
footnote in column 2 of the output. Column 1 is to be eliminated in the
output (I just use it for grouping).

Example Data (6 columns, sometimes 7):

 <Row>
   <Cell><Data ss:Type="String">LAS</Data></Cell>
   <Cell><Data ss:Type="String">Masterreport</Data></Cell>
   <Cell><Data ss:Type="String">alle 4 Lizenzarten</Data></Cell>
   <Cell><Data ss:Type="String">Lizenzdruck</Data></Cell>
   <Cell><Data ss:Type="String">Jasper</Data></Cell>
   <Cell><Data ss:Type="String">pilot_licence_CH.xml</Data></Cell>
   <Cell><Data ss:Type="String">Alle Lizenzvorlagen sind in zip-Dateien
zusammengefasst.</Data></Cell>
 </Row>

Output should be (5 columns):

 <row>
   <entry>Masterreport</entry>
   <entry>alle 4 Lizenzarten<footnote>
       <para>Alle Lizenzvorlagen sind in zip-Dateien
zusammengefasst.</para>
     </footnote>
   </entry>
   <entry>Lizenzdruck</entry>
   <entry>Jasper</entry>
   <entry>pilot_licence_CH.xml</entry>
 </row>

My approach is to use simple template matching for rows and cells:

 <xsl:template match="Row">
   <row>
     <xsl:apply-templates/>
   </row>
 </xsl:template>

 <xsl:template match="Cell[position() &gt; 1 and position() &lt; 7]">
   <entry>
     <xsl:value-of select="Data"/>
     <xsl:if test="position()=3 and following-sibling::Cell[7]">
       <xsl:message>+++ making footnote +++</xsl:message>
       <footnote><para><xsl:value-of
select="following-sibling::Cell[7]/Data"/></para></footnote>
     </xsl:if>
   </entry>
 </xsl:template>


But this way, I don't get any footnote at all (probably, I'm using position() in an incorrect way?). While playing around with the line

<xsl:if test="position()=3 and following-sibling::Cell[7]">

I got the impression that position() and  following-sibling::e:Cell[x] do
not see the "absolute" node positions of the cells in the original tree,
but only the filtered set of the match by

Cell[position() &gt; 1 and position() &lt; 7],

which should result in 5 cells (am I right here?). In consequence, I tried
to switch down the node number in the if statement, and with "5" I finally
got footnotes (in the first cell)

<xsl:if test="following-sibling::e:Cell[5]">

not really knowing why "5" and not "6" (if the position is calculated from
the current context node of the first cell?). Any further attempts to
refine the statement with position()=2, to move the footnote to the second
column, didn't succeed.

I have to admit, that my proceeding was "try and error" here (very
unsatisfying to me), so can someone please point out, what is going on in
my template.

Thanks,
Georges





This e-Mail may contain proprietary and confidential information and is sent for the intended recipient(s) only. If by an addressing or transmission error this mail has been misdirected to you, you are requested to delete this mail immediately.
You are also hereby notified that any use, any form of reproduction, dissemination, copying, disclosure, modification,
distribution and/or publication of this e-mail message, contents or its attachment other than by its intended recipient/s is strictly prohibited.


Visit Us at http://www.polaris.co.in







--
--------------------------------------
Georges Schmitz
Projektleitung
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Tel: 09131 / 877-176
Fax: 09131 / 877-136
Mob: 0163 / 877 1623
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
HEITEC AG
Werner-von-Siemens-Str. 61
91052 Erlangen
--------------------------------------

Current Thread