Bart --
You are returning a String so XalanJ is treating it as just that -- a
String. What you want to return is your NodeSet so that it can be
properly treated like a node-set.
One example:
import org.apache.xpath.NodeSet;
import org.apache.xerces.dom.DOMImplementationImpl;
import org.w3c.dom.DOMImplementation;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.Element;
public class node1 {
public static org.apache.xpath.NodeSet getMyXMLStr()
{
DOMImplementation myDOM =
DOMImplementationImpl.getDOMImplementation();
Document myDoc = createDocument(null, "DOCUMENT", null);
Node textNode = myDoc.createTextNode("FOO");
Element elemNode = myDoc.createElementNS(null, "ELEM1A");
elemNode.appendChild(textNode);
textNode = myDoc.createTextNode("elemlevel");
Element elemNode2 = myDoc.createElementNS(null, "ELEM1");
elemNode2.appendChild(textNode);
elemNode2.appendChild(elemNode);
textNode = myDoc.createTextNode("doclevel");
elemNode = myDoc.getDocumentElement();
elemNode.appendChild(textNode);
elemNode.appendChild(elemNode2);
NodeSet retval = new NodeSet(elemNode);
retval.setShouldCacheNodes(true);
return retval;
}
}
I haven't tested this but you get the idea. If you XML is already in a
file, you may be better off just building a DOM parser and parsing it.
HTH,
Gary
"Bart W.Jenkins" wrote:
>
> Gary,
> No problem...here are the files:
>
> Hope you can give me some clues...otherwise I am in trouble as I need to be
> able to retrieve node sets or RTFs from JAVA code...
>
> TIA
>
> Bart Jenkins, CTO
> Globeflow SA
> Cardenal Marcelo Spinola 2, D1, Planta 6
> 28016 Madrid, Spain
> mobile telephone: +34 667 65 10 75
>
> -----Original Message-----
> From: Gary L Peskin [mailto:[EMAIL PROTECTED]]
> Sent: Thursday, July 26, 2001 6:14 PM
> To: [EMAIL PROTECTED]
> Subject: Re: UPDATE: How to correctly process, via Xpath,
> result-tree-fragments returned by JAVA extensions? More questions...
>
> Bart --
>
> In order to understand what you're talking about, please supply the Java
> code for your extension function as well as working XML and XSLT to
> demonstrate the problem. It's very difficult to answer questions like
> this without seeing the whole picture.
>
> When your extension function returns a Node, the extension mechanism
> returns a node-set containing just that single node.
>
> I'm not sure why you say " ... the entire RTF that comes from my JAVA
> call ..." because, when you return a Node, your java program is not
> returning an RTF but a node-set.
>
> Anyway, if you attach the three items that I mentioned, we'll be able to
> look and see what's happening. It would help if you put some comments
> in your XSLT indicating what works and what doesn't.
>
> Thanks,
> Gary
>
> "Bart W.Jenkins" wrote:
> >
> > All,
> > My original post (see below) discussed the problem I was having
> processing
> > (via XPATH) a nodeset returned from a JAVA function call. In the original
> > trials, I was returning a java.lang.String. I since modified my JAVA
> > function to return an org.w3c.dom.Node object and am experiencing the same
> > problem in the XSL processing of this return result. That is, I can place
> > the entire RTF that comes from my JAVA call into the result tree but any
> > applied XPATH statements on it don't seem to do anything. Is it possible
> > that the Xalan processor is seeing "escaped" data and so does not
> recognize
> > the data as a true RTF?
> >
> > Interestingly, if I put this same RTF into the XSL directly, things work
> > fine. That is, if I have:
> >
> > <xsl:variable name="klient">
> >
> <DOCUMENT>doclevel<ELEM1>elem1level<ELEM1A>FOO</ELEM1A></ELEM1></DOCUMENT>
> > </xsl:variable>
> >
> > ...and I don't use the nodeset extension function and try this...
> >
> > <xsl:value-of select="$klient/DOCUMENT/ELEM1/ELEM1A"/>
> >
> > I get the error: "XSLT Error (javax.xml.transform.TransformerException):
> Can
> > not convert #RTREEFRAG to a NodeList!"
> > (Note: If I use the document() command to pull in this same RTF from a
> file
> > URI, the above select statement works fine which is very convenient)
> >
> > ...however, if I then surround the RTF with the nodeset function like
> this:
> >
> > <xsl:value-of select="xalan:nodeset($klient)/DOCUMENT/ELEM1/ELEM1A"/>
> >
> > ...this will then correctly return the element value "FOO".
> >
> > AS MENTIONED EARLIER, THIS DOES NOT WORK IF THE SAME DATA FOR VARIABLE
> > "klient" IS RETURNED FROM A JAVA FUNCTION CALL. More importantly, this
> does
> > not work either when I return a java.lang.String or a org.w3c.dom.Node
> > object.
> >
> > Is this a bug? Any ideas? ...anyone...?
> >
> > Bart Jenkins, CTO
> > Globeflow SA
> > Cardenal Marcelo Spinola 2, D1, Planta 6
> > 28016 Madrid, Spain
> > telephone: +34 667 65 10 75
> >
> > > -----Original Message-----
> > > From: Bart W.Jenkins
> > > Sent: Wednesday, July 25, 2001 7:22 PM
> > > To: '[EMAIL PROTECTED]'
> > > Subject: How to correctly process, via Xpath, result-tree-fragments
> > > returned by JAVA extensions?
> > >
> > > All,
> > > Environment:
> > > OS = Windows 2000 Pro
> > > JAVA=java full version "1.3.1-b24"
> > > Xalan=xalan-j_2_2_D6
> > >
> > > I have XSL that uses the Xalan JAVA extensions mechanism to make calls
> to
> > > JAVA code to return both simple types (like String) and
> > > result-tree-fragments like the following:
> > >
> > > <DOCUMENT>
> > > <ELEM1>
> > > <ELEM1A>Foo</ELEM1A>
> > > </ELEM1>
> > > </DOCUMENT>
> > >
> > > Problem: Why, when I apply the "xalan:nodeset()" function to my RTF
> that
> > > comes back from my JAVA function can I not use XPATH statements to get
> at
> > > specific elements or attributes in my RTF data?
> > >
> > > Example: Assuming I have a declaration like:
> > >
> > > <?xml version='1.0' encoding='ISO-8859-1' ?>
> > > <xsl:stylesheet version="1.0"
> > > xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
> > > xmlns:Ext="class:com.hg.client"
> > > xmlns:xalan="http://xml.apache.org/xalan"
> > > exclude-result-prefixes="Ext xalan"
> > > >
> > >
> > > I then call into a JAVA function like this:
> > >
> > > <xsl:variable name="myRTF"
> > > select='Ext:myClass.myMethod("someParamData")'/>
> > >
> > > Which does indeed return an RTF which I can see fully if I do a value-of
> > > like:
> > >
> > > <xsl:value-of select="myRTF"/>
> > >
> > > Now, assuming I want the value of "<ELEM1A>" which is "Foo", I assume I
> > > should do this:
> > >
> > > <xsl:value-of select="xalan:nodeset(myRTF)/DOCUMENT/ELEM1/ELEM1A"/>
> > >
> > > But this returns NOTHING and gives NO ERROR. Can someone tell me why?
> > >
> > > Thanks in advance...
> > >
> > > Bart Jenkins, CTO
> > > Globeflow SA
> > > Cardenal Marcelo Spinola 2, D1, Planta 6
> > > 28016 Madrid, Spain
> > > telephone: +34 667 65 10 75
> > >
>
> ------------------------------------------------------------------------
>
> simple.xmlName: simple.xml
> Type: BizTalk Schema (text/xml)
>
> Name: simple.xsl
> simple.xsl Type: BizTalk Schema (text/xml)
> Encoding: quoted-printable
>
> node1.javaName: node1.java
> Type: unspecified type (application/octet-stream)