You are viewing a plain text version of this content. The canonical link for it is here.
Posted to j-users@xalan.apache.org by Ju...@t-systems.com on 2004/02/02 12:25:43 UTC

SQL extension is not returning the correct resultset??!

Hello,

I am using the SQl extension from xalan to retrieve some data form a database. After the connection if I iterate over the resultset I get still the same row. The interation index is correct. For example:

Table:
1 | test1
2 | test2
3 | test3

I get:

Zeilennummer148; Spaltennummer15; 3
Zeilennummer148; Spaltennummer15; test3
Zeilennummer148; Spaltennummer15; 3
Zeilennummer148; Spaltennummer15; test3
Zeilennummer148; Spaltennummer15; 3
Zeilennummer148; Spaltennummer15; test3

If I use the same code on a local created variable, with the same xml-strucure I get the correct values:

Zeilennummer148; Spaltennummer15; 1
Zeilennummer148; Spaltennummer15; test1
Zeilennummer148; Spaltennummer15; 2
Zeilennummer148; Spaltennummer15; test2
Zeilennummer148; Spaltennummer15; 3
Zeilennummer148; Spaltennummer15; test3

Has someone the same effect?

Juraj


XSL:

<?xml version="1.0"?>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

                version="1.0"

                xmlns:sql="org.apache.xalan.lib.sql.XConnection"

                extension-element-prefixes="sql"
                
                xmlns:xalan="http://xml.apache.org/xalan"
                   
                exclude-result-prefixes="xalan"                
                
                >



<xsl:output method="html" indent="yes"/>

<!-- parameter setting to connect to DB2
<xsl:param name="driver" select="'COM.ibm.db2.jdbc.app.DB2Driver'"/>

<xsl:param name="datasource" select="'jdbc:db2:sample'"/>
-->

<!-- parameter setting to connect to MySQL -->

<xsl:param name="driver" select="'com.mysql.jdbc.Driver'"/>

<xsl:param name="datasource" select="'jdbc:mySQL://localhost/test'"/>

<xsl:param name="query" select="'SELECT * FROM testtabelle'"/>

<xsl:param name="username" select="'root'"/>

<xsl:param name="passwd" select="''"/>

<xsl:variable name="testt">
	<row-set>
		<row>
			<col>1</col>
			<col>test1</col>
		</row>
		<row>
			<col>2</col>
			<col>test2</col>
		</row>
		<row>
			<col>3</col>
			<col>test3</col>
		</row>
	</row-set>	
</xsl:variable>


<xsl:template match="/">

    

    <xsl:variable name="db" select="sql:new()"/>

    

    <!-- Connect to the database with minimal error detection -->

		<xsl:if test="not(sql:connect($db, $driver, $datasource, $username, $passwd))" >

    	<xsl:message>Error Connecting to the Database</xsl:message>

      <xsl:copy-of select="sql:getError($db)/ext-error" />

    </xsl:if>

    

    <HTML>

      <HEAD>

        <TITLE>List of products</TITLE>

      </HEAD>

      <BODY>

        <TABLE border="1">

          <xsl:variable name="table" select='sql:query($db, $query)'/>

          

          <!-- 

          	Let's include Error Checking, the error is actually stored 

            in the connection since $table will be either data or null

          -->

             

          <xsl:if test="not($table)" >

          	<xsl:message>Error in Query</xsl:message>

            <xsl:copy-of select="sql:getError($db)/ext-error" />

          </xsl:if>

          

          <TR>

             <xsl:for-each select="$table/sql/metadata/column-header">

               <xsl:message><xsl:value-of select="@column-label"/></xsl:message>

             </xsl:for-each>

          </TR>

<!--          <xsl:apply-templates select="$table/sql/row-set"/> -->
		  <xsl:variable name="testtabelle2" select="xalan:nodeset($testt)"/>
          <xsl:apply-templates select="$testtabelle2/row-set"/>

        </TABLE>

      </BODY>

    </HTML>

    <xsl:value-of select="sql:close($db)"/>

</xsl:template>

<xsl:template match="row-set">
  <xsl:for-each select="./row">
  	<xsl:apply-templates select="."/>
  </xsl:for-each>		
</xsl:template>

<xsl:template match="row">
  <xsl:apply-templates select="./col"/>
</xsl:template>

<xsl:template match="col">
	<xsl:message><xsl:value-of select="./text()"/></xsl:message>
</xsl:template>



</xsl:stylesheet>

Re: SQL extension is not returning the correct resultset??!

Posted by Christine Li <jy...@ca.ibm.com>.



Hi, Juraj

It may related to bug 12337 @
http://nagoya.apache.org/bugzilla/show_bug.cgi?id=12337 . It provides a
workaround by adding a dummy template. If you twist your stylesheet a bit
by changing
<xsl:template match="row-set">
  <xsl:for-each select="./row">
             <xsl:apply-templates select="."/>
  </xsl:for-each>
</xsl:template>

To

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

It should work. You can refer to the extension sample codes shipped with
Xalan.

Christine Li
XSLT Development
IBM Toronto Lab
Tel: (905)413-2601
Email: jycli@ca.ibm.com


                                                                           
             Juraj.Lenharcik@t                                             
             -systems.com                                                  
                                                                        To 
             02/02/2004 06:25          xalan-j-users@xml.apache.org        
             AM                                                         cc 
                                                                           
                                                                   Subject 
                                       SQL extension is not returning the  
                                       correct resultset??!                
                                                                           
                                                                           
                                                                           
                                                                           
                                                                           
                                                                           




Hello,

I am using the SQl extension from xalan to retrieve some data form a
database. After the connection if I iterate over the resultset I get still
the same row. The interation index is correct. For example:

Table:
1 | test1
2 | test2
3 | test3

I get:

Zeilennummer148; Spaltennummer15; 3
Zeilennummer148; Spaltennummer15; test3
Zeilennummer148; Spaltennummer15; 3
Zeilennummer148; Spaltennummer15; test3
Zeilennummer148; Spaltennummer15; 3
Zeilennummer148; Spaltennummer15; test3

If I use the same code on a local created variable, with the same
xml-strucure I get the correct values:

Zeilennummer148; Spaltennummer15; 1
Zeilennummer148; Spaltennummer15; test1
Zeilennummer148; Spaltennummer15; 2
Zeilennummer148; Spaltennummer15; test2
Zeilennummer148; Spaltennummer15; 3
Zeilennummer148; Spaltennummer15; test3

Has someone the same effect?

Juraj


XSL:

<?xml version="1.0"?>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

                version="1.0"

                xmlns:sql="org.apache.xalan.lib.sql.XConnection"

                extension-element-prefixes="sql"

                xmlns:xalan="http://xml.apache.org/xalan"

                exclude-result-prefixes="xalan"

                >



<xsl:output method="html" indent="yes"/>

<!-- parameter setting to connect to DB2<xsl:param name="driver"
select="'COM.ibm.db2.jdbc.app.DB2Driver'"/><xsl:param name="datasource"
select="'jdbc:db2:sample'"/>-->

<!-- parameter setting to connect to MySQL -->

<xsl:param name="driver" select="'com.mysql.jdbc.Driver'"/>

<xsl:param name="datasource" select="'jdbc:mySQL://localhost/test'"/>

<xsl:param name="query" select="'SELECT * FROM testtabelle'"/>

<xsl:param name="username" select="'root'"/>

<xsl:param name="passwd" select="''"/>

<xsl:variable name="testt">
             <row-set>
                         <row>
                                     <col>1</col>
                                     <col>test1</col>
                         </row>
                         <row>
                                     <col>2</col>
                                     <col>test2</col>
                         </row>
                         <row>
                                     <col>3</col>
                                     <col>test3</col>
                         </row>
             </row-set>
</xsl:variable>


<xsl:template match="/">



    <xsl:variable name="db" select="sql:new()"/>



    <!-- Connect to the database with minimal error detection -->

                         <xsl:if test="not(sql:connect($db, $driver,
$datasource, $username, $passwd))" >

             <xsl:message>Error Connecting to the Database</xsl:message>

      <xsl:copy-of select="sql:getError($db)/ext-error" />

    </xsl:if>



    <HTML>

      <HEAD>

        <TITLE>List of products</TITLE>

      </HEAD>

      <BODY>

        <TABLE border="1">

          <xsl:variable name="table" select='sql:query($db, $query)'/>



          <!--                Let's include Error Checking, the error is
actually stored             in the connection since $table will be either
data or null          -->



          <xsl:if test="not($table)" >

                   <xsl:message>Error in Query</xsl:message>

            <xsl:copy-of select="sql:getError($db)/ext-error" />

          </xsl:if>



          <TR>

             <xsl:for-each select="$table/sql/metadata/column-header">

               <xsl:message><xsl:value-of
select="@column-label"/></xsl:message>

             </xsl:for-each>

          </TR>

<!--          <xsl:apply-templates select="$table/sql/row-set"/> -->
                           <xsl:variable name="testtabelle2"
select="xalan:nodeset($testt)"/>
          <xsl:apply-templates select="$testtabelle2/row-set"/>

        </TABLE>

      </BODY>

    </HTML>

    <xsl:value-of select="sql:close($db)"/>

</xsl:template>

<xsl:template match="row-set">
  <xsl:for-each select="./row">
             <xsl:apply-templates select="."/>
  </xsl:for-each>
</xsl:template>

<xsl:template match="row">
  <xsl:apply-templates select="./col"/>
</xsl:template>

<xsl:template match="col">
             <xsl:message><xsl:value-of select="./text()"/></xsl:message>
</xsl:template>



</xsl:stylesheet>