You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@cocoon.apache.org by Steve Philp <sp...@ameritech.net> on 2002/01/01 09:29:34 UTC

SQL, XSL and xml:sort'ing resultsets with request parameters

I've spent most of the day today trudging through various search engines, FAQs, mailing list archives and the Cocoon-2 site, but I still seem to be missing something critical in getting something that seems simple working.

The problem revolves around how to efficiently use request parameters to choose a SQL resultset column to sort by in my stylesheet.

I've got the following in sitemap.xmap:

	<map:match pattern="sql/*">
		<map:generate src="docs/samples/sql/{1}.xml"/>
		<map:transform type="sql">
			<map:parameter name="use-connection" value="testdb"/>
		</map:transform>
		<map:transform src="stylesheets/employees.xsl">
			<map:parameter name="use-request-parameters" value="true"/>
		</map:transform>
		<map:serialize/>
	</map:match>

I should mention that the XSLT transformer is also modified to turn on request parameters.

The SQL xml document looks like:

	<?xml version="1.0"?>

	<page xmlns:sql="http://apache.org/cocoon/SQL/2.0">
		<title>Employees</title>
		<content>
			<execute-query xmlns="http://apache.org/cocoon/SQL/2.0"> 
				<query>
					select emid, emfname, emlname from employee
				</query>
			</execute-query>
		</content>
	</page>

Both are nearly stock from the Cocoon distribution and seem to work just fine (that is, the output is what I would expect to see).  

My problem comes in attempting to take that resultset and process it in the stylesheet.  Ideally, I'd like to create a single stylesheet that would use the HTTP request parameter order_by as the sort-by column.  My XSL looks like this (including just the relevant template):

	<xsl:template match="sql:rowset">
		<xsl:param name="order_by"/>
		<table border="0" width="100%">
			<tr bgcolor="aaccee" align="left">
				<th><a href="?order_by=sql:emid">Employee ID</a></th>
				<th><a href="?order_by=sql:emfname">First Name</a></th>
				<th><a href="?order_by=sql:emlname">Last Name</a></th>
			</tr>
			<xsl:for-each select="sql:row">
				<xsl:sort select="$order_by"/>
				<tr>
					<xsl:attribute name="bgcolor">
						<xsl:choose>
							<xsl:when test="position() mod 2 = 0">
								<xsl:text>white</xsl:text>
							</xsl:when>
						</xsl:choose>
					</xsl:attribute>
					<xsl:apply-templates/>
				</tr>
			</xsl:for-each>
		</table>
	</xsl:template>

It appears to me that $order_by DOES hold the value that I'm interested in, since I can include: 

	<td><xsl:value-of select="$order_by"/></td>

just after the <xsl:apply-templates/> and get the expected value in that column.



The mailing list archives mentioned something similar to "*[name()=$order_by]" as being a working answer, but it doesn't seem to have any affect upon the output in this situation.

With my limited knowledge of Cocoon and XSL, I'm not sure where to go from here.  I have tested using URI path extensions (e.g. /sql/sql-page/ByID) and choosing the stylesheet in sitemap.xmap based on that, and that seems to work, but it would work out to be a maintenance nightmare holding onto stylesheets for each possible sortable column in each page.

If I want to use request parameters, are XSPs my only option?

What (obvious, I'm quite sure) options do I have at this point?

Thank you for any help or pointers anyone can offer,

--
Steve Philp
Advance Packaging Corporation
sphilp@ameritech.net

---------------------------------------------------------------------
Please check that your question has not already been answered in the
FAQ before posting. <http://xml.apache.org/cocoon/faqs.html>

To unsubscribe, e-mail: <co...@xml.apache.org>
For additional commands, e-mail: <co...@xml.apache.org>


RequestDispatchers in xsp

Posted by "Årun.Ñ" <ar...@eximsoft.com>.
Hi,
        Is there any way to use request dispatchers in my xsp page. I am
using cocoon 2 and there is a problem with the cocoons wrapper classes for
request .... to get the requestDispatcher. I cannot use the redirect
approach as there are lot of disadvantages of that like,  it is a client
pull another hit to server, network traffic, as it becomes a second request
i will not be able to get the parameters with the previous request etc ....

thankx in advance
Arun.N



---------------------------------------------------------------------
Please check that your question has not already been answered in the
FAQ before posting. <http://xml.apache.org/cocoon/faqs.html>

To unsubscribe, e-mail: <co...@xml.apache.org>
For additional commands, e-mail: <co...@xml.apache.org>


Re: SQL, XSL and xml:sort'ing resultsets with request parameters

Posted by Bernhard Huber <be...@a1.net>.
hi,
I found in webapp/stylesheets/system/profiler.xsl following xsl-code 
snippet which might
help you:
        <table noshade="noshade" border="0" cellspacing="1" 
cellpadding="0" width="100%">
          <xsl:choose>
            <xsl:when test="$sort = 'uri'">
              <xsl:apply-templates>
                 <xsl:sort select="@profile:uri"/>
              </xsl:apply-templates>
            </xsl:when>
            <xsl:when test="$sort = 'time'">
              <xsl:apply-templates>
                 <xsl:sort select="@profile:time" data-type="number"/>
              </xsl:apply-templates>
            </xsl:when>
            <xsl:when test="$sort = 'count'">
              <xsl:apply-templates>
                 <xsl:sort select="@profile:count" data-type="number"/>
              </xsl:apply-templates>
            </xsl:when>
            <xsl:otherwise>
              <xsl:apply-templates/>
            </xsl:otherwise>
          </xsl:choose>
        </table>

It seems the trick is to map the $sort directly to a xsl:sort.
Hope it helps.
profiler.xsl is part of the Cocoon2 CVS distribution.
bye bernhard



Steve Philp wrote:

>I've spent most of the day today trudging through various search engines, FAQs, mailing list archives and the Cocoon-2 site, but I still seem to be missing something critical in getting something that seems simple working.
>
>The problem revolves around how to efficiently use request parameters to choose a SQL resultset column to sort by in my stylesheet.
>
>I've got the following in sitemap.xmap:
>
>	<map:match pattern="sql/*">
>		<map:generate src="docs/samples/sql/{1}.xml"/>
>		<map:transform type="sql">
>			<map:parameter name="use-connection" value="testdb"/>
>		</map:transform>
>		<map:transform src="stylesheets/employees.xsl">
>			<map:parameter name="use-request-parameters" value="true"/>
>		</map:transform>
>		<map:serialize/>
>	</map:match>
>
>I should mention that the XSLT transformer is also modified to turn on request parameters.
>
>The SQL xml document looks like:
>
>	<?xml version="1.0"?>
>
>	<page xmlns:sql="http://apache.org/cocoon/SQL/2.0">
>		<title>Employees</title>
>		<content>
>			<execute-query xmlns="http://apache.org/cocoon/SQL/2.0"> 
>				<query>
>					select emid, emfname, emlname from employee
>				</query>
>			</execute-query>
>		</content>
>	</page>
>
>Both are nearly stock from the Cocoon distribution and seem to work just fine (that is, the output is what I would expect to see).  
>
>My problem comes in attempting to take that resultset and process it in the stylesheet.  Ideally, I'd like to create a single stylesheet that would use the HTTP request parameter order_by as the sort-by column.  My XSL looks like this (including just the relevant template):
>
>	<xsl:template match="sql:rowset">
>		<xsl:param name="order_by"/>
>		<table border="0" width="100%">
>			<tr bgcolor="aaccee" align="left">
>				<th><a href="?order_by=sql:emid">Employee ID</a></th>
>				<th><a href="?order_by=sql:emfname">First Name</a></th>
>				<th><a href="?order_by=sql:emlname">Last Name</a></th>
>			</tr>
>			<xsl:for-each select="sql:row">
>				<xsl:sort select="$order_by"/>
>				<tr>
>					<xsl:attribute name="bgcolor">
>						<xsl:choose>
>							<xsl:when test="position() mod 2 = 0">
>								<xsl:text>white</xsl:text>
>							</xsl:when>
>						</xsl:choose>
>					</xsl:attribute>
>					<xsl:apply-templates/>
>				</tr>
>			</xsl:for-each>
>		</table>
>	</xsl:template>
>
>It appears to me that $order_by DOES hold the value that I'm interested in, since I can include: 
>
>	<td><xsl:value-of select="$order_by"/></td>
>
>just after the <xsl:apply-templates/> and get the expected value in that column.
>
>
>
>The mailing list archives mentioned something similar to "*[name()=$order_by]" as being a working answer, but it doesn't seem to have any affect upon the output in this situation.
>
>With my limited knowledge of Cocoon and XSL, I'm not sure where to go from here.  I have tested using URI path extensions (e.g. /sql/sql-page/ByID) and choosing the stylesheet in sitemap.xmap based on that, and that seems to work, but it would work out to be a maintenance nightmare holding onto stylesheets for each possible sortable column in each page.
>
>If I want to use request parameters, are XSPs my only option?
>
>What (obvious, I'm quite sure) options do I have at this point?
>
>Thank you for any help or pointers anyone can offer,
>
>--
>Steve Philp
>Advance Packaging Corporation
>sphilp@ameritech.net
>
>---------------------------------------------------------------------
>Please check that your question has not already been answered in the
>FAQ before posting. <http://xml.apache.org/cocoon/faqs.html>
>
>To unsubscribe, e-mail: <co...@xml.apache.org>
>For additional commands, e-mail: <co...@xml.apache.org>
>
>



---------------------------------------------------------------------
Please check that your question has not already been answered in the
FAQ before posting. <http://xml.apache.org/cocoon/faqs.html>

To unsubscribe, e-mail: <co...@xml.apache.org>
For additional commands, e-mail: <co...@xml.apache.org>