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?
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
[File: TransformTest.java]
package com.cleancode.xml;
import java.io.File;
import java.io.FileOutputStream;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.stream.StreamSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.dom.DOMResult;
import javax.xml.transform.dom.DOMSource;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.apache.xalan.serialize.Serializer;
import org.apache.xalan.serialize.SerializerFactory;
import org.apache.xalan.templates.OutputProperties;
public class TransformTest {
private static void echoXml(Node node, String what) throws Exception
{
System.out.println("Echoing "+what+":");
Serializer serializer = SerializerFactory.getSerializer
(OutputProperties.getDefaultMethodProperties("xml"));
serializer.setOutputStream(System.out);
serializer.asDOMSerializer().serialize(node);
System.out.println("");
System.out.println("Echo "+what+" complete.");
}
public static void main( String[] args ) throws Exception {
String inName = "test.xml";
String outName = "test.out";
String xslName = "test.xsl";
boolean optA = (args.length > 0) && "-A".equals(args[0]);
boolean optB = (args.length > 0) && "-B".equals(args[0]);
boolean optC = (args.length > 0) && "-C".equals(args[0]);
boolean ignoreWhitespace = false;
boolean ignoreComments = false;
boolean putCDATAIntoText = false;
boolean createEntityRefs = false;
DocumentBuilderFactory dbf =
DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
dbf.setIgnoringComments(ignoreComments);
dbf.setIgnoringElementContentWhitespace(ignoreWhitespace);
dbf.setCoalescing(putCDATAIntoText);
dbf.setExpandEntityReferences(!createEntityRefs);
DocumentBuilder db = dbf.newDocumentBuilder();
Element docRoot = db.parse(inName).getDocumentElement();
echoXml(docRoot, "Input");
File XslFile = new File(xslName);
TransformerFactory tFactory =
TransformerFactory.newInstance();
Transformer transformer =
tFactory.newTransformer(new StreamSource(XslFile));
DOMResult dr = new DOMResult();
if (optA) {
transformer.transform(new StreamSource(inName), dr);
echoXml(dr.getNode(), "Output");
}
else if (optB) {
try { transformer.transform(new DOMSource(docRoot),
dr); }
catch (Exception e) {
System.out.println("transform
[DOMSource=>DOMResult] failed:" + e);
}
echoXml(dr.getNode(), "Output");
}
else if (optC) {
transformer.transform(new DOMSource(docRoot),
new StreamResult(new
FileOutputStream(outName)));
System.out.println("output stored in " + outName);
}
else {
System.out.println("usage: TransformTest [ -A|-B|-C
]");
}
}
}
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
[File: test.xsl]
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:cc="stuff.com"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:output method="xml" indent="yes" omit-xml-declaration="no" />
<xsl:template match="/files">
<cc:myDoc>
<xsl:for-each select="file">
<cc:indexItem>
<file><xsl:value-of select="."/></file>
</cc:indexItem>
</xsl:for-each>
</cc:myDoc>
</xsl:template>
</xsl:stylesheet>
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
[File: test.xml]
<?xml version="1.0" encoding="UTF-8"?>
<files>
<file>motivation.xml</file>
<file>history.xml</file>
</files>
- - - - - - - - - - - - - - - - - - - - - - - - - - - -