[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message]

Re: inconsistent results from stylesheet

Subject: Re: inconsistent results from stylesheet
From: "Steve Muench" <smuench@xxxxxxxxxxxxx>
Date: Mon, 17 Apr 2000 16:52:28 -0700
templates fire
Bob,

Using our latest production release 2.0.2.7, 
the following test program does what you're 
trying to do, but I get the correctly re-sorted
data formatted by the final XSLT stylesheet into
HTML with the order of the <a> cells sorted.

Hope this helps find what might be awry in your
environment. (P.S. If you've got a database, why
not let *it* do the ORDER BY instead of doing
DOM tree surgery?)

thanks.

import oracle.xml.parser.v2.*;
import org.w3c.dom.*;
import java.io.*;

public class Bob {
  private static DOMParser dp = null;
  private static XMLDocument getXML(String name) throws Throwable {
    if (dp==null) dp = new DOMParser();
    dp.parse(new FileInputStream(name));
    return (XMLDocument)dp.getDocument();
  }
 public static void main(String[] args) throws Throwable {
   // setup (overall question: Why not let database do the sorting?)
   XMLDocument xmlsrc      = getXML("Bob.xml");
   XMLDocument xml2htmlsrc = getXML("xml2html.xsl");
   XMLDocument bobsortsrc  = getXML("identitysort.xsl");
   XSLStylesheet xml2html = new XSLStylesheet(xml2htmlsrc,null);
   XSLStylesheet bobsort  = new XSLStylesheet(bobsortsrc,null);
   XSLProcessor p = new XSLProcessor();
   // remember <rowset> element
   Node whereRowsetIs = xmlsrc.selectSingleNode("//rowset");
   // Transform orig sort to get "sorted" <rowset> data.
   DocumentFragment df = xmlsrc.transformNode(bobsort);
   // Find the <rowset> in the sorted document
   Node sortedRowset = ((XMLNode)df.getFirstChild()).selectSingleNode(".//rowset");
   // Insert the new sorted <rowset> and remove the old one
   whereRowsetIs.getParentNode().insertBefore(sortedRowset,whereRowsetIs);
   whereRowsetIs.getParentNode().removeChild(whereRowsetIs);
   // Transform original doc with surgically inserted sorted <rowset> to HTML
   p.processXSL(xml2html,xmlsrc,System.out);
 }
}

Produces the expected (sorted) HTML results of:

<html>
   <body>
      <table>
         <tr>
            <td>11</td>
            <td>Bob</td>
         </tr>
         <tr>
            <td>12</td>
            <td>Steve</td>
         </tr>
      </table>
   </body>
</html>

When fed the following three files:

<!-- Bob.xml -->
<resultset>
  <rowset>
    <row><a>12</a><b>Steve</b></row>
    <row><a>11</a><b>Bob</b></row>
  </rowset>
</resultset>

<!-- IdentitySort.xsl -->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>
   <xsl:template match='rowset'>
     <xsl:copy>
       <xsl:apply-templates select='row'>
         <xsl:sort select='a' data-type='number'/>
       </xsl:apply-templates>
     </xsl:copy>
   </xsl:template>
</xsl:stylesheet>

<!-- xml2html.xsl-->
<xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'>
  <xsl:output method="html"/>
  <xsl:template match="/">
    <html><body><table>
    <xsl:for-each select="//rowset/row">
      <tr>
        <td><xsl:value-of select="a"/></td>
        <td><xsl:value-of select="b"/></td>
      </tr>
    </xsl:for-each>
    </table></body></html>
  </xsl:template>
</xsl:stylesheet>
______________________________________________________________
Steve Muench, Lead XML Evangelist & Consulting Product Manager
Business Components for Java & XSQL Servlet Development Teams
Oracle Rep to the W3C XSL Working Group
----- Original Message ----- 
From: "Bob White" <milkchaser@xxxxxxxxx>
To: "XSL XSL" <XSL-List@xxxxxxxxxxxxxxxx>
Sent: Monday, April 17, 2000 2:53 PM
Subject: inconsistent results from stylesheet


| I am using the Oracle XSLT processor to translate XML into HTML.  My
| XML is pulled from an Oracle DB as a DOM document, then I apply my
| parsed XSL stylesheet.  Works fine the first time.
| 
| When the user requests that the results be sorted, I apply a second
| stylesheet with little more than an xsl:sort command to sort the data
| section of my document (all other nodes are simply copied from the
| source tree to the result tree).  The sort operation leaves me with a
| document-fragment.  I find the node in my original XML DOM document
| that matches the root of the sorted document-fragment and I replace
| that node with the sorted data.
| 
| Then I re-apply my XML-to-HTML stylesheet again to the sorted data. 
| But the second time I apply my stylesheet, it does not work.
| 
| My XML looks like this:
| <RESULTSET>
|   <COLUMNLIST>...</COLUMNLIST>
|   <ROWSET>
|     <ROW>
|       <C1>...</C1>
|       <C2>...</C2>
|       <C3>...</C3>
|     </ROW>
|     ...
|   </ROWSET>
| </RESULTSET>
| 
| What could be simpler?  I have a template for the data section that
| matches on the <ROWSET> tag.
| 
| <xsl:template match="ROWSET">
|   <xsl:message>
|      Inside ROWSET template...
|   </xsl:message>
|   <xsl:for-each select="ROW[position() = ($SkipRows+1)]">
|     ...
|   </xsl:for-each>
| </xsl:template>
| 
| The first time I apply my stylesheet, I see this message and I know
| that the template is being applied as expected.  But the second time
| I apply this stylesheet, this template does not fire.  Instead, I see
| the default template fire for the <ROWSET> node:
| 
| <xsl:template match="*|/">
|   <xsl:message>
|      Applying templates from default "*|/" template,
|      node:<xsl:value-of select="name()" />!!
|   </xsl:message>
|   ...
| </xsl:template>
| 
| This puts a console message of:
|      Applying templates from default "*|/" template,
|      node:ROWSET!!
| 
| I have worked around this problem by naming my "ROWSET" template and
| explicitly calling my ROWSET template from the "*|/" template as
| follows:
|   <xsl:if test="name()='ROWSET'">
|     <xsl:call-template name="insert-rowset"/>
|   </xsl:if>
| 
| This works, but shouldn't the template fire based on the
| match="ROWSET" attribute?  
| <xsl:template match="ROWSET" name="insert-rowset">
|     ...
| </xsl:template>
| 
| Is this a bug in the Oracle processor?
| 
| ..Bob.
| 
| =====
| -- Bob White --
| See photos of Oxana, my beautiful bride!
| http://milkchaser.tripod.com
| 203-926-1888 x3287
| "Make it legal" -- www.norml.org
| 
| __________________________________________________
| Do You Yahoo!?
| Send online invitations with Yahoo! Invites.
| http://invites.yahoo.com
| 
| 
|  XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
| 


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


Current Thread

PURCHASE STYLUS STUDIO ONLINE TODAY!

Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!

Buy Stylus Studio Now

Download The World's Best XML IDE!

Accelerate XML development with our award-winning XML IDE - Download a free trial today!

Don't miss another message! Subscribe to this list today.
Email
First Name
Last Name
Company
Subscribe in XML format
RSS 2.0
Atom 0.3
Site Map | Privacy Policy | Terms of Use | Trademarks
Free Stylus Studio XML Training:
W3C Member
Stylus Studio® and DataDirect XQuery ™are products from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2013 All Rights Reserved.