You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@xalan.apache.org by bu...@apache.org on 2001/05/16 03:22:39 UTC

[Bug 1762] New - URIResolver's resolve() method is not invoked when document() function is used in stylesheet.

http://nagoya.apache.org/bugzilla/show_bug.cgi?id=1762

*** shadow/1762	Tue May 15 18:22:39 2001
--- shadow/1762.tmp.5562	Tue May 15 18:22:39 2001
***************
*** 0 ****
--- 1,149 ----
+ +============================================================================+
+ | URIResolver's resolve() method is not invoked when document() function is  |
+ +----------------------------------------------------------------------------+
+ |        Bug #: 1762                        Product: XalanJ2                 |
+ |       Status: NEW                         Version: 2.0.x                   |
+ |   Resolution:                            Platform: Sun                     |
+ |     Severity: Normal                   OS/Version: Solaris                 |
+ |     Priority:                           Component: javax.xml               |
+ +----------------------------------------------------------------------------+
+ |  Assigned To: xalan-dev@xml.apache.org                                     |
+ |  Reported By: krishna.meduri@SUN.com                                       |
+ |      CC list: Cc:                                                          |
+ +----------------------------------------------------------------------------+
+ |          URL:                                                              |
+ +============================================================================+
+ |                              DESCRIPTION                                   |
+ Description:
+ ============
+ URIResolver's resolve() method is not invoked when document() function is used
+ in stylesheet. For xsl:import and xsl:include URIResolver's resolve method is
+ invoked as expected. But for document() method it doesn't work.
+ 
+ For the following stylesheet named "doctest.xsl"
+ -------------------------------------------------------------------------------
+ <?xml version="1.0"?>
+ <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
+ <xsl:output method="html" version="4.0" indent="yes" encoding="iso-8859-1"/>
+ 
+ <xsl:template match="/">
+ <html>
+ <body>
+ <xsl:variable name="colors" select="document('colors.xml')/colors"/>
+ <p>Nodes in color <xsl:value-of select="count($colors)"/></p>
+ <xsl:apply-templates/>
+ </body>
+ </html>
+ </xsl:template>
+ 
+ </xsl:stylesheet>
+ -------------------------------------------------------------------------------
+ 
+ colors.xml file:
+ -------------------------------------------------------------------------------
+ <?xml version="1.0" encoding="UTF-8"?>
+ <colors>
+ <dark>
+  <container name="book">
+   <category name="developer" version="1">088ea6</category>
+   <category name="default" version="1">0839a6</category>
+  </container>
+ </dark>
+ </colors>
+ -------------------------------------------------------------------------------
+ 
+ On command line if I give,
+ java org.apache.xalan.xslt.Process -XSL doctest.xsl -URIRESOLVER TestURIR
+ 
+ it would print out,
+ 
+ href <colors.xml> base <file:/home/kmeduri/rnd/doctest.xsl>
+ href <colors.xml> base <file:/home/kmeduri/rnd/doctest.xsl>
+ <html>
+ <body>
+ <p>Nodes in color 1</p>
+ </body>
+ </html>
+ 
+ invoking resolve method of TestURIR.java.
+ 
+ TestURIR.java
+ --------------------------------------------------------------------------------
+ import javax.xml.transform.*;
+ import javax.xml.transform.stream.StreamSource;
+ import java.io.*;
+ 
+ public class TestURIR implements URIResolver {
+     public static void main(String[] str) {
+ 
+         /*At SYSTEM_ID, both doctest.xsl and colors.xml (which is sent as
+          *argument to document() function ) exist */
+         String SYSTEM_ID="file:///home/kmeduri/rnd/";
+ 
+         TransformerFactory tfactory = TransformerFactory.newInstance();
+         tfactory.setURIResolver(new TestURIR());
+         try {
+             StreamSource streamSource = new StreamSource(new
+                                 FileInputStream("doctest.xsl"));
+             streamSource.setSystemId(SYSTEM_ID);
+             Transformer transformer = tfactory.newTransformer(streamSource);
+         } catch (Exception e) {
+             System.out.println("Exception raised <" + e.getMessage() + ">");
+         }
+     } // end of main()
+ 
+     public Source resolve(String href, String base) {
+         System.out.println("href <" + href + "> base <" + base + ">");
+         return null;
+     }
+ 
+ } // end of class
+ --------------------------------------------------------------------------------
+ If we run this program using 
+ java TestURIR
+ it doesn't invoke resolve method which it should.
+ 
+ The documentation for URIResolver says,
+ "Called by the processor when it encounters an xsl:include, xsl:import, 
+ or document() function."
+ 
+ For the same java program, if citiesinclude.xsl file is used (instead of 
+ doctest.xsl) which uses xsl:include to include cities.xsl file, the "resolve"
+ method is invoked and the following is printed.
+ href <cities.xsl> base <file:///home/kmeduri/rnd/>
+ 
+ where the files are as follows:
+ citiesinclude.xsl
+ =================
+ <?xml version="1.0" ?>
+ <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
+         <xsl:include href="cities.xsl"/>
+ </xsl:stylesheet>
+ 
+ cities.xsl
+ ==========
+ <?xml version="1.0" standalone="yes"?>
+ <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
+ <xsl:output method="xml" indent="yes"/>
+ <xsl:template match="/">
+ <xsl:variable name="unique-countries"
+         select="/cities
+                 /city[not(@country=preceding-sibling::city/@country)]
+                 /@country"
+ />
+     <countries>
+         <xsl:for-each select="$unique-countries">
+           <country name="{.}">
+                 <xsl:for-each select="//city[@country=current()]">
+                   <city><xsl:value-of select="@name"/></city>
+                 </xsl:for-each>
+           </country>
+         </xsl:for-each>
+     </countries>
+ </xsl:template>
+ </xsl:stylesheet>
+ 
+ ================================================================================
+ Platform: Solaris 2.6
+ Reproduceable. Used JDK1.3
+ Hardware: Sparc