Gary,
First, thanks for being so patient...we are investing heavily in XML / XSL
and making sure we know this technology thoroughly is critical. And I agree
with you...the first form is easier.
All right...more questions!
Prior to the Xalan versions that use DTM (specifically version 1_2_1),
regardless whether my JAVA code returned a nodelist or a nodeset, I could
then use the Xpath form we have been discussing:
$var/node1/node2/...
in my XSL, but when I try this with Xalan 1_2_2_D7, (one that uses DTM), I
get the following error:
XSLT Error (javax.xml.transform.TransformerException): Can not convert
#UNKNOWN (org.apache.xml.dtm.ref.DTMNodeList) to a NodeList!
In the docs for version 1_2_2_D7, in the description for DTM, it states:
"For the convenience of user-written extensions, a proxy mechanism presents
the contents of the DTM as a read-only subset of the DOM"
How do I make use of this proxy? My error above suggests that this
conversion is not happening for me automatically. Any pointers? Or, should
I drop back to v 1_2_1?
Bart Jenkins, CTO
Globeflow SA
Cardenal Marcelo Spinola 2, D1, Planta 6
28016 Madrid, Spain
telephone: +34 667 65 10 75
mailto:[EMAIL PROTECTED]
-----Original Message-----
From: Gary L Peskin [mailto:[EMAIL PROTECTED]]
Sent: Monday, July 30, 2001 6:25 PM
To: [EMAIL PROTECTED]
Subject: Re: UPDATE: How to correctly process, via Xpath,
result-tree-fragments returned by JAVA extensions? More questions...
"Bart W.Jenkins" wrote:
>
> Gary,
> Ok. I got your sample to work also and now I know why...
> There are 2 things different with your sample...
>
> 1. You use the xsl:variable option in which you place the select as the
> attribute in the xsl:variable element name instead of in the element body.
> That is, you used:
>
> <xsl:variable name="myRTF" select='Ext:getMyXMLStr()'/>
>
> and this works, however...
>
> <xsl:variable name="myRTF">
> <xsl:value-of select='Ext:getMyXMLStr()'/>
> </xsl:variable>
>
> does NOT, and I thought the two forms of declaration were equivalent.
No, they're different. See http://www.w3.org/TR/xslt#variable-values.
The first is a node-set. The second is an RTF, for which you'd need to
use the nodeset extension function if you want to navigate. I think the
first easier because you don't have to use the nodeset extension
function.
>
> 2. Also, you don't use the top level element name in the XPATH call, that
> is, you used...
>
> <xsl:value-of select="$myRTF/ELEM1/ELEM1A"/>
>
> instead of...
>
> <xsl:value-of select="$myRTF/DOCUMENT/ELEM1/ELEM1A"/>
>
> which surprised me! The second form is the correct one if you use the
> document() function to pull in an XML file from a URI, that is, if my
> declaration for getting the xml file had been...
>
> <xsl:variable name="client" select="document('simple2.xml')"/>
>
> and this contained the same data as before, you would need to use
> $myRTF/DOCUMENT/...
>
> Is this difference from the document() function an implementation
> interpretation issue, a peculiarity of the spec, or a mistake?
This is a little confusing. The way I've written getMyXMLStr(), it
returns a node-set consisting of a single node, the DOCUMENT node. If
you want to use your syntax, just change the getMyXMLStr() function to
return the document by changing
NodeSet retval = new NodeSet(elemNode);
to
NodeSet retval = new NodeSet(myDoc);
That way, getMyXMLStr() will return a node-set consisting of a single
node, the document root. Then, your XPath should work fine. The
document() function returns the document root (see
http://www.w3.org/TR/xslt#document) which is why it behaves the way it
does.
If you have more questions, please come back with them. It's important
to understand this stuff.
HTH,
Gary