|
[XSL-LIST Mailing List Archive Home]
[By Thread]
[By Date]
[Recent Entries]
[Reply To This Message]
Re: how to handle structured data from Java
Subject: Re: how to handle structured data from Java
From: Robert Koberg <rob@xxxxxxxxxx>
Date: Mon, 10 Jan 2005 19:16:11 -0800
|
Kevin Rodgers wrote:
Robert Koberg writes:
Kevin Rodgers wrote:
I need to pass an attribute value to a Java method implemented by a
co-worker and save the resulting object in a variable (since it's a
relatively expensive operation), then access the object's string
components. Should I write an extension function in Java to call his
method and convert the object into a DOM Node that would be stored via
<xsl:value-of name="variable" select="extension:function(@attribute)">?
How would I then access its subnodes -- via select="$variable/component-x"?
You really don't want to use extensions.
Or is there a better way?
I think so. Have your co-worker create a class that implements
javax.xml.transform.URIResolver. It should check for the value coming in
as an href. When the resolver sees your attribute value, have him return
an appropriate XML Source. Then you can do the following in your XSL:
<xsl:variable name="myvar" select="document(@myattr)"/>
OK, but where do I reference HisClass?
URIResolver only declares the resolve method, which returns a Source.
But the Source interface only declares 2 methods, getSystemId and
setSystemId, neither of which is defined to return a dynamic value like
an XML string.
And since the document function takes a URI, shouldn't the select
expression be something like
"document(concat('http://server/HisServlet?foo=', @myattr))"
If so, then why does he need to implement URIResolver as HisClass --
couldn't he just implement HisServlet?
There are several ways to handle the situation. It might be appropriate
to use an XMLFilter chain and never use the document function. This
removes the concern of gathering source XML in the transformation. As
for a URIResolver, it allows the user to gather source XML as defined by
the URIResolver.
For example, in the resolve method, you could:
<xsl:apply-templates select="document('foo')"/>
....
Source source = null;
File file = project.resolveFile(href);
if (file.exists()) {
source = new StreamSource(new FileInputStream(file));
} else if (href.equals("someObject")) {
source = project.getObjectAsSaxSource(href);
} else {
source = new StreamSource(new StringReader("<file-not-found/>"));
}
return source;
best,
-Rob
Thanks,

|
PURCHASE STYLUS STUDIO ONLINE TODAY!
Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!
Download The World's Best XML IDE!
Accelerate XML development with our award-winning XML IDE - Download a free trial today!
Subscribe in XML format
| RSS 2.0 |
|
| Atom 0.3 |
|
|