Subject: Re: [xsl] XSL java extension newbie question|
From: "sivaram g" <raviyellanet@xxxxxxxxxxx>
Date: Thu, 02 Oct 2003 21:28:50 +0000
From: Tim Meals <tmeals@xxxxxxxxx> Reply-To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx Subject: Re: [xsl] XSL java extension newbie question Date: Thu, 02 Oct 2003 13:26:08 -0700
See inline comments ...
On Thu, 2003-10-02 at 12:38, sivaram g wrote:
> I am trying to write a simple test xsl file using java extensions. I have a
> simple xml file that says
> I want to use xsl to gather all the item names into a class called MyTest
> so i have MyTest.java as
> public class MyTest
> int itemsCount=0;
> public void foundItem()
Have you visited http://xml.apache.org/xalan-j/extensions.html#java-namespace already? They have several useful examples on how to write an extension class. The easiest thing to do would make itemsCount and foundItem both static, being as the class doesn't really exhibit any behavior like an object -- it's just a static counter. (Realize, of course, you can do the same thing with <xsl:value-of select="count(/items/item/name)"/>, which will give you a count of all /items/item/name nodes.)
> I want to create an object of this class and pass to an xsl stylesheet so it
> can update it when the transformation is being done. And I cant find a way
> to get the stylesheet to access the object i have passed in. it seems to
> create a new object of type MyTest and update it. A lot of examples i've
> seen of passing objects as parameters into XSLs only seem to print it out in
> the xsl...how do i update the passed in parameter in the xsl.
> my main reads...
> public static void main (Stringargs)
> String xmlFile = "input.xml";
> String xslFile = "input.xsl";
> MyTransformer myt;
> Source xml;
> Source xsl;
> Result result = new StreamResult (System.out);
> HashMap params = new HashMap ();
> MyTest x=new MyTest();
> myt = new MyTransformer ();
> xml = myt.SourceFromFilename (xmlFile);
> xsl = myt.SourceFromFilename (xslFile);
> params.put ("changeme", x);
> myt.transform (xml, xsl, result, params);
> } catch (Exception e)
> System.out.println ("Exception: " + e.getMessage ());
> and the xsl reads as
> <?xml version="1.0" ?>
> <xsl:stylesheet version="1.0"
> <xsl:param name="changeme" />
> <xsl:template match="/">
> <!-- this does print the object as in main -->
> <xsl:value-of select="$changeme"/>
> <xsl:apply-templates select="items">
> <xsl:with-param name="changeme" select="$changeme" />
> <xsl:template match="items">
According to the above <xsl:apply-templates>, you should have <xsl:param> defined here too. I imagine Xalan isn't complaining because changeme is a global parameter to the stylesheet. Your <xsl:with-param> line isn't really necessary.
> <xsl:apply-templates select="item"> > </xsl:apply-templates> > </xsl:template> > <xsl:template match="item"> > <xsl:value-of select="mytest:foundItem()"/>
In your MyTest class, foundItem returns nothing. I'm not sure what you're trying to accomplish here.
> please point to a doc/example which shows how to use the object passed into
> the xsl.
Please see the Xalan link above. I think you'll find everything you need there. Also, take a look in your Xalan distribution. There's a samples/extensions directory with source code.
> Share your photos without swamping your Inbox. Get Hotmail Extra Storage
> today! http://join.msn.com/?PAGE=features/es
> XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
Tim Meals <tmeals@xxxxxxxxx>
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list