You are viewing a plain text version of this content. The canonical link for it is here.
Posted to j-users@xalan.apache.org by Ziv Ben-Eliahu <zi...@wirexn.com> on 2006/12/27 10:58:37 UTC
Re: transform() fails for DOMSource but succeeds for StreamSource
Hi There.
I have a similar problem - fails for DOMSource but succeeds for
StreamSource - but failure is not an error, it is a different output.
I have the following XML:
<apple xmlns="http://purl.oclc.org/NET/JSX/0.3/Apple">
<shop type="happy-days">
<owner name="Jhon" type="big"/>
</shop>
<order name="GooGoo" type="org.goo" />
</apple>
I have two parsers - an identity-transformer and a xsl-transformer :
Transformer tfCopy = javax.xml.transform.TransformerFactory
.newInstance().newTransformer();
Transformer tf = javax.xml.transform.TransformerFactory
.newInstance()newTransformer(
new StreamSource(new File("Apple.xsl")));
I have three source type - by stream, builder-parsed, builder-created:
Document parsedDoc = builder.parse(new File("apple.xml"));
DOMSource parsedSource = new DOMSource(parsedDoc);
StreamSource streamSource = new StreamSource(new File("apple.xml"));
DOMSource builtSource = new DOMSource(build()); // build() is a manual
build of the parsed document
When I use the identity-transformer the results are the same:
tfCopy.transform(streamSource, new StreamResult(new
File("d:/streamed.xml")));
tfCopy.transform(builtSource, new StreamResult(new
File("d:/built.xml")));
tfCopy.transform(parsedSource, new StreamResult(new
File("d:/parsed.xml")));
When I use the XSL-based-transformer, results are completely different.
tf.transform(builtSource, new StreamResult(new
File("d:/built.html")));
tf.transform(parsedSource, new StreamResult(new
File("d:/parsed.html")));
tf.transform(streamSource, new StreamResult(new
File("d:/streamed.html")));
I won't include them since they are long, but to sum up:
The stream-source gave the expected results.
The parsed-dom-source (from the same file as the stream-source) gave bad
results - its like the Document was not recognized.
The manually-built-dom-source gave the expected results.
Question: how come identity-transformer worked fine with the parsed DOM
and a xsl-transformer did not?
My current solution is:
Use the identity-transformer to copy from the parsed-dom to a
result-dom. Then take the node from the result-dom. The XSL-transformer
works fine with that node.
Thank you for your help,
Ziv.
SORENS,MICHAEL (HP-Boise,ex1) wrote:
> I want to do a transform with a DOMSource input. If I do this from a file
> (i.e. StreamSource), it works fine, but changing only the argument to
> transform() to be a DOMSource, then the transformation fails with a
> HIERARCHY_REQUEST_ERR. I boiled down a test for this to its simplest form,
> containing 80 lines of code below. This code performs one of three
> transforms (differing in type of argument) by invoking with "-A", "-B", or
> "-C". It uses supplementary files test.xml and test.xsl following.
> Question 1: Why does transform() fail if I use a DOMSource argument??
>
> I believe I am using Xalan 2.4.0 and Xerces 2.3.0.
> Question 2: How does one query Xalan/Xerces to find the version number?
Re: transform() fails for DOMSource but succeeds for StreamSource
Posted by Stanimir Stamenkov <st...@myrealbox.com>.
/Ziv Ben-Eliahu/:
> Document parsedDoc = builder.parse(new File("apple.xml"));
>
> The stream-source gave the expected results.
> The parsed-dom-source (from the same file as the stream-source) gave bad
> results - its like the Document was not recognized.
> The manually-built-dom-source gave the expected results.
Is your |builder| configured to produce a namespace aware DOM? Is
your "manually-built-dom" namespace aware? If both DOM instances
have different namespace awareness - this could be the reason,
although I can't think of anything specific at the moment.
--
Stanimir
Re: transform() fails for DOMSource but succeeds for StreamSource
Posted by Mike Brown <mi...@skew.org>.
I'm guessing but I think the answer is the same as before - if you fail to set
a system ID that is a full URI, results will be unpredictable.
In your examples, you start using your DOMSource and your StreamSource
objects without having set their system IDs. I suggest creating the File
objects separately so that you can use their .getAbsoluteFile().toURI()
methods to obtain a proper URI that you can use as the system ID in your
Source objects. Then set that ID in those objects either in the constructor or
via a separate call to their .setSystemID() method.
Let us know if it works.
Ziv Ben-Eliahu wrote:
> Hi There.
> I have a similar problem - fails for DOMSource but succeeds for
> StreamSource - but failure is not an error, it is a different output.
>
> I have the following XML:
> <apple xmlns="http://purl.oclc.org/NET/JSX/0.3/Apple">
> <shop type="happy-days">
> <owner name="Jhon" type="big"/>
> </shop>
> <order name="GooGoo" type="org.goo" />
> </apple>
>
> I have two parsers - an identity-transformer and a xsl-transformer :
> Transformer tfCopy = javax.xml.transform.TransformerFactory
> .newInstance().newTransformer();
> Transformer tf = javax.xml.transform.TransformerFactory
> .newInstance()newTransformer(
> new StreamSource(new File("Apple.xsl")));
>
> I have three source type - by stream, builder-parsed, builder-created:
> Document parsedDoc = builder.parse(new File("apple.xml"));
> DOMSource parsedSource = new DOMSource(parsedDoc);
> StreamSource streamSource = new StreamSource(new File("apple.xml"));
> DOMSource builtSource = new DOMSource(build()); // build() is a manual
> build of the parsed document
>
>
> When I use the identity-transformer the results are the same:
> tfCopy.transform(streamSource, new StreamResult(new
> File("d:/streamed.xml")));
> tfCopy.transform(builtSource, new StreamResult(new
> File("d:/built.xml")));
> tfCopy.transform(parsedSource, new StreamResult(new
> File("d:/parsed.xml")));
>
>
>
> When I use the XSL-based-transformer, results are completely different.
> tf.transform(builtSource, new StreamResult(new
> File("d:/built.html")));
> tf.transform(parsedSource, new StreamResult(new
> File("d:/parsed.html")));
> tf.transform(streamSource, new StreamResult(new
> File("d:/streamed.html")));
>
>
> I won't include them since they are long, but to sum up:
> The stream-source gave the expected results.
> The parsed-dom-source (from the same file as the stream-source) gave bad
> results - its like the Document was not recognized.
> The manually-built-dom-source gave the expected results.
>
>
> Question: how come identity-transformer worked fine with the parsed DOM
> and a xsl-transformer did not?
>
>
> My current solution is:
> Use the identity-transformer to copy from the parsed-dom to a
> result-dom. Then take the node from the result-dom. The XSL-transformer
> works fine with that node.
>
> Thank you for your help,
> Ziv.
>
>
>
> SORENS,MICHAEL (HP-Boise,ex1) wrote:
> > I want to do a transform with a DOMSource input. If I do this from a file
> > (i.e. StreamSource), it works fine, but changing only the argument to
> > transform() to be a DOMSource, then the transformation fails with a
> > HIERARCHY_REQUEST_ERR. I boiled down a test for this to its simplest form,
> > containing 80 lines of code below. This code performs one of three
> > transforms (differing in type of argument) by invoking with "-A", "-B", or
> > "-C". It uses supplementary files test.xml and test.xsl following.
> > Question 1: Why does transform() fail if I use a DOMSource argument??
> >
> > I believe I am using Xalan 2.4.0 and Xerces 2.3.0.
> > Question 2: How does one query Xalan/Xerces to find the version number?
>