Re: [xsl] Node Order and Value determination

Subject: Re: [xsl] Node Order and Value determination
From: scott gabelhart <swgabel@xxxxxxxxxxxx>
Date: Wed, 04 Feb 2004 16:37:36 -0500
Josh Canfield wrote:

The included files are neither complete nor simplified.

Here is an example of simplified XML input:

<TABLE>
	<DPROW>
		<OBJECT></OBJECT>
	</DPROW>
	<TABLE>
		<DPROW>
			<OBJECT></OBJECT>
			<OBJECT></OBJECT>
		</DPROW>
	</TABLE>
</TABLE>

Here is an example of simplified XSL

<?xml version="1.0" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
xmlns:fo="FO">
<xsl:template match="TABLE">
<fo:table>
<xsl:apply-templates/>
</fo:table>
</xsl:template>


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

<xsl:template match="OBJECT">
 <fo:table-column>
   <xsl:apply-templates/>
 </fo:table-column>
</xsl:template>

</xsl:stylesheet>

Here is an example of the output I get:

<?xml version="1.0" encoding="utf-8"?>
<fo:table xmlns:fo="FO">
 <fo:table-row>
   <fo:table-column/>
 </fo:table-row>
 <fo:table>
   <fo:table-row>
     <fo:table-column/>
     <fo:table-column/>
   </fo:table-row>
 </fo:table>
</fo:table>

Using this example, what is the output that you want to get?

Josh

-----Original Message-----
From: owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx
[mailto:owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx]On Behalf Of scott
gabelhart
Sent: Wednesday, February 04, 2004 11:11 AM
To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
Subject: Re: [xsl] Node Order and Value determination


Jarno.Elovirta@xxxxxxxxx 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[@border='1'] or
ancestor::thead[@border='1'] or
ancestor::table[@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


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





Josh,

you are correct. Jarno asked me to include my complete stylesheet, requested output, and I included a partial piece of my xml input file given the size of my xml file

Anyway based upon your examples I have attached my simplied xml, xsl, and required output.

xml file

<TABLE>
   <DPROW>
       <OBJECT>2</OBJECT>
   </DPROW>
</TABLE>
<TABLE>
      <DPROW>
       <OBJECT>1</OBJECT>
   </DPROW>
   <TABLE>
      <DPROW>
       <OBJECT>3</OBJECT>
        <OBJECT>4</OBJECT>
      </DPROW>
</TABLE>

xsl file
<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>


output

<?xml version="1.0" encoding="utf-8"?>
<fo:table xmlns:fo="FO">
 <fo:table-row>
   <fo:table-column/>
 </fo:table-row>
</fo:table>
 <fo:table>
   <fo:table-row>
     <fo:table-column/>
     </fo:table-row>
	<fo:table>
	  <fo:table-row>
		<fo:table-column/>
		<fo:table-column/>
	   </fo:table-row>
        </fo:table>
 </fo:table>

My current XPath statement in my TABLE template does not understand/handle the nested xml structure I currently am faced with.
What do I need to add to my XPath expression?

- Scott





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


Current Thread