xsl-list
[Top] [All Lists]

problems with position() and following-sibling

2005-08-12 01:37:13
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


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