I'm wondering if I've run into a mis-feature. The crux of the problem is
that I'm trying use the following as the input to a transform:
new DOMSource(doc.getDocumentElement())
Why would I want to do that? Especially when new DOMSource(doc) works
just fine? Well, I'm trying to conform to an interface that's part of
Apache Axis and what you get from that interface is an Element rather
than a Node or a Document.
And what happens when I try this? The root element appears not to exist.
<xsl:template match="/MyRootElement"> (see example) doesn't match
anything. In fact, <xsl:template match="/"> doesn't match anything. Even
though <xsl:template match="MyRootElement"> does match.
There may be a perfectly valid reason for this that I don't understand,
but the reason I think it's a bug is that the behavior of XSLTC and the
regular transformer differ. I see the problem behavior in the regular
transformer, but not in XSLTC.
I've included a simple repro that shows the odd behavior in the hopes
that code is clearer than my muddled explaination.
-Chris
---------- TestTransform.java ----------
package xsltest;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import org.w3c.dom.Document;
public class TestTransform {
public Document readDoc(String path) throws Exception {
return
DocumentBuilderFactory.newInstance().newDocumentBuilder()
.parse(getClass().getResourceAsStream(path));
}
public void works() throws Exception {
StreamSource xsl = new StreamSource(
getClass().getResourceAsStream("/xsltest/simple.xsl"));
Document doc = readDoc("/xsltest/simple.xml");
TransformerFactory transformerFactory = new
org.apache.xalan.xsltc.trax.TransformerFactoryImpl();
Transformer transformer =
transformerFactory.newTransformer(xsl);
transformer.transform(
new DOMSource(doc.getDocumentElement()),
new StreamResult(System.out));
}
public void alsoWorks() throws Exception {
StreamSource xsl = new StreamSource(
getClass().getResourceAsStream("/xsltest/simple.xsl"));
Document doc = readDoc("/xsltest/simple.xml");
// transformer is a org.apache.xalan.transformer.TransformerImpl
TransformerFactory transformerFactory = new
org.apache.xalan.processor.TransformerFactoryImpl();
Transformer transformer =
transformerFactory.newTransformer(xsl);
transformer.transform(
new DOMSource(doc),
new StreamResult(System.out));
}
public void doesntWork() throws Exception {
StreamSource xsl = new StreamSource(
getClass().getResourceAsStream("/xsltest/simple.xsl"));
Document doc = readDoc("/xsltest/simple.xml");
// transformer is a org.apache.xalan.transformer.TransformerImpl
TransformerFactory transformerFactory = new
org.apache.xalan.processor.TransformerFactoryImpl();
Transformer transformer =
transformerFactory.newTransformer(xsl);
transformer.transform(
new DOMSource(doc.getDocumentElement()),
new StreamResult(System.out));
}
public static void main(String[] args) throws Exception {
TestTransform tt = new TestTransform();
tt.works();
tt.alsoWorks();
tt.doesntWork();
}
}
---------- simple.xsl -----------
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="MyRootElement">
<found-my-root-element/>
</xsl:template>
</xsl:stylesheet>
---------- simple.xml ----------
<?xml version="1.0" encoding="UTF-8"?>
<MyRootElement>
<data value="42"/>
<data value="17"/>
</MyRootElement>