xsl-list
[Top] [All Lists]

Re: Node Order and Value determination

2004-02-04 12:11:08
Jarno(_dot_)Elovirta(_at_)nokia(_dot_)com wrote:

Hi,

thanks for the timely reply. The problem is your suggestion doesn't solve my problem.

I want my xml structure when being transformed to determine for each <OBJECT> element the creation of a corresponding <fo:table-column>

transform code snippet

<xsl:template match="TABLE">
<fo:table table-layout="fixed" width="7.5in" space-before.optimum="5pt"> <!--xsl:call-template name="for-loop"/-->
           <!--xsl:call-template name="build-columns"/-->
            <xsl:for-each select="TABLE/DPROW/OBJECT">

This should be

 <xsl:for-each select="DPROW/OBJECT">

<fo:table-column column-width="{6.26 div last()}in"/>
            </xsl:for-each>

<fo:table-body>
               <xsl:apply-templates select="*"/>
           </fo:table-body>
       </fo:table>
   </xsl:template>
creates in my output hundreds of fo:table-column tags.

xml input file snippet

<TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0" WIDTH="842" OCCURENCE="2">
                   <DPROW>
                       <OBJECT ALIGN="left" WIDTH="3"/>
                       <OBJECT>
<TABLE WIDTH="100%" BORDER="0" CELLSPACING="0" CELLPADDING="0" OCCURENCE="2">
                               <DPROW>
                                   <OBJECT WIDTH="4" HEIGHT="6"/>
                                   <OBJECT WIDTH="22" HEIGHT="6"/>
                                   <OBJECT WIDTH="67" HEIGHT="6"/>
                                   <OBJECT WIDTH="2" HEIGHT="6"/>
                                   <OBJECT WIDTH="211" HEIGHT="6"/>
                                   <OBJECT WIDTH="2" HEIGHT="6"/>
                                   <OBJECT WIDTH="273" HEIGHT="6"/>
                                   <OBJECT WIDTH="48" HEIGHT="6"/>
                                   <OBJECT WIDTH="92" HEIGHT="6"/>
                                   <OBJECT WIDTH="2" HEIGHT="6"/>
                                   <OBJECT WIDTH="2" HEIGHT="6"/>
                                   <OBJECT WIDTH="82" HEIGHT="6"/>
                                   <OBJECT WIDTH="6" HEIGHT="6"/>
                                   <OBJECT WIDTH="22" HEIGHT="6"/>
                                   <OBJECT WIDTH="5" HEIGHT="6"/>
                               </DPROW>
For the first TABLE/DPROW/OBJECT containing two object elements I would need to create two corresponding fo:table-column tags and for the second TABLE/DPROW/OBJECT containing fifteen object elements I would need to create fifteen corresponding fo:table-column tags.

What does it create then if not that (after the fix mentioned above)?

What am I doing wrong in the XPath declaration?

It's called "XPath expression". If your stylesheet still doesn't work, please 
send a complete, simplified example source document with the stylesheet you have so far, 
*and* example of the desired output.

Cheers,

Jarno - Melotron: Kein Problem (Problemzonen-Mix)

XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list


Jarno,

thanks for the response. I tried your most current suggestion previously myself and I am still getting the wrong result.

My xml input file is modeled very closely against html a html <table> is a <TABLE>; a <tr> is a <DPROW>, and a <td> is a <OBJECT>.

My xml input file has nested html tables and that is where the problem is coming in when trying to transform this particular input file.

I have attached my xslt, along with partial xml input file and output. What I need to determine for my xsl:fo output is between the start of a <TABLE> element in my input file and either the start of a new <TABLE> or <DPROW> element how many <OBJECT> elements were contained. Example

<TABLE><DPROW><OBJECT></OBJECT></DPROW></TABLE> should yield one fo:table-column.
<TABLE><DPROW><OBJECT></OBJECT></DPROW><TABLE><DPROW><OBJECT></OBJECT><OBJECT></OBJECT></DPROW></TABLE>
should yield two fo:table-column for the inner table and a single fo:table-column for the outer table.

Essential in XPath how do I inspect from one <TABLE> element to either the ending </DPROW> of corresponding closing </TABLE> element the number of <OBJECT> elements.

xml input file:
<TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0" OCCURENCE="1">
                   <DPROW>
<OBJECT ALIGN="left" STYLE="background-color:#FFFFFF;" HEIGHT="10"/>
                   </DPROW>
               </TABLE>
<TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0" WIDTH="842" OCCURENCE="2">
                   <DPROW>
                       <OBJECT ALIGN="left" WIDTH="3"/>
                       <OBJECT>
<TABLE WIDTH="100%" BORDER="0" CELLSPACING="0" CELLPADDING="0" OCCURENCE="2">
                               <DPROW>
                                   <OBJECT WIDTH="4" HEIGHT="6"/>
                                   <OBJECT WIDTH="22" HEIGHT="6"/>
                                   <OBJECT WIDTH="67" HEIGHT="6"/>
                                   <OBJECT WIDTH="2" HEIGHT="6"/>
                                   <OBJECT WIDTH="211" HEIGHT="6"/>
                                   <OBJECT WIDTH="2" HEIGHT="6"/>
                                   <OBJECT WIDTH="273" HEIGHT="6"/>
                                   <OBJECT WIDTH="48" HEIGHT="6"/>
                                   <OBJECT WIDTH="92" HEIGHT="6"/>
                                   <OBJECT WIDTH="2" HEIGHT="6"/>
                                   <OBJECT WIDTH="2" HEIGHT="6"/>
                                   <OBJECT WIDTH="82" HEIGHT="6"/>
                                   <OBJECT WIDTH="6" HEIGHT="6"/>
                                   <OBJECT WIDTH="22" HEIGHT="6"/>
                                   <OBJECT WIDTH="5" HEIGHT="6"/>
                               </DPROW>
                               <DPROW>
                                   <OBJECT WIDTH="4"/>
                                   <OBJECT WIDTH="22"/>
                                   <OBJECT WIDTH="67" VALIGN="top">
<TABLE BORDER="0" WIDTH="66" OCCURENCE="2">
                                           <DPROW>
<OBJECT STYLE="color:#000000;font-family:Arial;font-size:10pt;background-color:#FFFFFF;height:20px;font-weight:bold;">Agent ID:</OBJECT>
                                           </DPROW>
                                       </TABLE>
                                   </OBJECT>
<OBJECT WIDTH="2" COLSPAN="2" VALIGN="top"> <TABLE BORDER="0" WIDTH="212" OCCURENCE="2">
                                           <DPROW>
<OBJECT STYLE="color:#000000;font-family:Arial;font-size:12pt;background-color:#FFFFFF;height:20px;font-weight:bold;">100008</OBJECT>
                                           </DPROW>
                                       </TABLE>
                                   </OBJECT>
                                   <OBJECT WIDTH="2"/>
                                   <OBJECT WIDTH="273"/>
                                   <OBJECT WIDTH="48"/>
                                   <OBJECT WIDTH="92"/>
                                   <OBJECT WIDTH="2"/>
<..snip..>
xsl file

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"; xmlns:fo="http://www.w3.org/1999/XSL/Format";>
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

   <!--sect 1-->
   <xsl:template match="/">
       <xsl:apply-templates select="WITAGLIB"/>
   </xsl:template>
   <xsl:template match="WITAGLIB">
       <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format";>
           <!--sect 2-->
           <fo:layout-master-set>
<fo:simple-page-master master-name="all" page-height="11in" page-width="8.5in" margin-left=".25in" margin-right=".25in"> <fo:region-body region-name="all-body" margin-bottom=".55in" margin-top=".79in"/> <fo:region-before region-name="all-before" extent="1in" display-align="after" padding="6pt 1in"/> <fo:region-after region-name="all-after" extent="1in" display-align="before" padding="6pt 1in"/>
               </fo:simple-page-master>
               <!--sect 3-->
           </fo:layout-master-set>
           <fo:page-sequence master-reference="all">
               <xsl:apply-templates/>
           </fo:page-sequence>
       </fo:root>
   </xsl:template>
   <xsl:template match="FORMATTED">
<!-- ============================================
   Start generating the content for the main page
   area (xsl-region-body).
   =============================================== -->
       <fo:flow flow-name="all-body">
           <xsl:apply-templates/>
       </fo:flow>
   </xsl:template>
   <!--sect 4-->
   <xsl:template match="TABLE">
<fo:table table-layout="fixed" width="7.5in" space-before.optimum="5pt"> <xsl:for-each select="DPROW/OBJECT">
               <fo:table-column column-width="{6.26 div last()}in"/>
            </xsl:for-each>

<fo:table-body> <xsl:apply-templates/>


           </fo:table-body>
       </fo:table>

   </xsl:template>
   <!-- row section-->
   <xsl:template match="DPROW">
<fo:table-row> <xsl:apply-templates/>

       </fo:table-row>
</xsl:template>
   <!--sect 5-->
   <xsl:template match="OBJECT">
<fo:table-cell padding-start="3pt" padding-end="3pt" padding-before="3pt" padding-after="3pt" border-style="solid" border-color="black" border-width="1pt">
           <xsl:if test="@COLSPAN">
<xsl:attribute name="number-columns-spanned"><xsl:value-of select="@COLSPAN"/></xsl:attribute>
           </xsl:if>
           <xsl:if test="@ROWSPAN">
<xsl:attribute name="number-rows-spanned"><xsl:value-of select="@ROWSPAN"/></xsl:attribute>
           </xsl:if>
           <xsl:if test="@border='1' or
                   ancestor::tr[(_at_)border='1'] or
                   ancestor::thead[(_at_)border='1'] or
                   ancestor::table[(_at_)border='1']">
<xsl:attribute name="border-style"><xsl:text>solid</xsl:text></xsl:attribute> <xsl:attribute name="border-color"><xsl:text>black</xsl:text></xsl:attribute> <xsl:attribute name="border-width"><xsl:text>1pt</xsl:text></xsl:attribute>
           </xsl:if>
           <xsl:variable name="align">
               <xsl:choose>
                   <xsl:when test="@ALIGN">
                       <xsl:choose>
                           <xsl:when test="@ALIGN='center'">
                               <xsl:text>center</xsl:text>
                           </xsl:when>
                           <xsl:when test="@ALIGN='left'">
                               <xsl:text>left</xsl:text>
                           </xsl:when>
                           <xsl:when test="@ALIGN='right'">
                               <xsl:text>end</xsl:text>
                           </xsl:when>
                           <xsl:when test="@ALIGN='justify'">
                               <xsl:text>justify</xsl:text>
                           </xsl:when>
                           <xsl:otherwise>
                               <xsl:text>start</xsl:text>
                           </xsl:otherwise>
                       </xsl:choose>
                   </xsl:when>
</xsl:choose>
           </xsl:variable>
           <fo:block text-align="{$align}" wrap-option="no-wrap" >
<xsl:attribute name="font-family"><xsl:text>Courier</xsl:text></xsl:attribute> <xsl:attribute name="font-weight"><xsl:text>bold</xsl:text></xsl:attribute> <xsl:attribute name="font-size"><xsl:text>10pt</xsl:text></xsl:attribute> <xsl:choose>
               <xsl:when test="text() = '&#160;'">
                   <fo:block />
               </xsl:when>
               <xsl:otherwise>
                   <xsl:apply-templates select="*|text()"/>

               </xsl:otherwise>
               </xsl:choose>
           </fo:block>
       </fo:table-cell>
   </xsl:template>
   <!--sect 6-->
<!--sect 7--> <xsl:template match="title"> <fo:block space-after="18pt" line-height="27pt" font-size="24pt" font-weight="bold" text-align="center">
           <xsl:apply-templates select="*|text()"/>
       </fo:block>
   </xsl:template>
</xsl:stylesheet>

Current output:

<?xml version="1.0" encoding="UTF-8"?>
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format";>
   <fo:layout-master-set>
<fo:simple-page-master master-name="all" page-height="11in" page-width="8.5in" margin-left=".25in" margin-right=".25in"> <fo:region-body region-name="all-body" margin-bottom=".55in" margin-top=".79in"/> <fo:region-before region-name="all-before" extent="1in" display-align="after" padding="6pt 1in"/> <fo:region-after region-name="all-after" extent="1in" display-align="before" padding="6pt 1in"/>
       </fo:simple-page-master>
   </fo:layout-master-set>
   <fo:page-sequence master-reference="all">
       <fo:flow flow-name="all-body">
<fo:block space-after="18pt" line-height="27pt" font-size="24pt" font-weight="bold" text-align="center">Report1</fo:block> <fo:table table-layout="fixed" width="7.5in" space-before.optimum="5pt">
               <fo:table-column column-width="50pt"/>
               <fo:table-column column-width="6.26in"/>
               <fo:table-body>
                   <fo:table-row>
<fo:table-cell padding-start="3pt" padding-end="3pt" padding-before="3pt" padding-after="3pt" border-style="solid" border-color="black" border-width="1pt"> <fo:block text-align="left" wrap-option="no-wrap" font-family="Courier" font-weight="bold" font-size="10pt"/>
                       </fo:table-cell>
                   </fo:table-row>
               </fo:table-body>
           </fo:table>
<fo:table table-layout="fixed" width="7.5in" space-before.optimum="5pt">
               <fo:table-column column-width="50pt"/>
               <fo:table-column column-width="3.13in"/>
               <fo:table-column column-width="3.13in"/>
               <fo:table-body>
                   <fo:table-row>
<fo:table-cell padding-start="3pt" padding-end="3pt" padding-before="3pt" padding-after="3pt" border-style="solid" border-color="black" border-width="1pt"> <fo:block text-align="left" wrap-option="no-wrap" font-family="Courier" font-weight="bold" font-size="10pt"/>
                       </fo:table-cell>
<fo:table-cell padding-start="3pt" padding-end="3pt" padding-before="3pt" padding-after="3pt" border-style="solid" border-color="black" border-width="1pt"> <fo:block text-align="start" wrap-option="no-wrap" font-family="Courier" font-weight="bold" font-size="10pt"> <fo:table table-layout="fixed" width="7.5in" space-before.optimum="5pt">
                                   <fo:table-column column-width="50pt"/>
<fo:table-column column-width="0.0680434782608696in"/> <fo:table-column column-width="0.0680434782608696in"/> <fo:table-column column-width="0.0680434782608696in"/> <fo:table-column column-width="0.0680434782608696in"/> <fo:table-column column-width="0.0680434782608696in"/> <fo:table-column column-width="0.0680434782608696in"/> <fo:table-column column-width="0.0680434782608696in"/> <fo:table-column column-width="0.0680434782608696in"/> <fo:table-column column-width="0.0680434782608696in"/> <fo:table-column column-width="0.0680434782608696in"/> <fo:table-column column-width="0.0680434782608696in"/> <- This line repeats 300 + times for all the object occurences in the complete xml file



XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list