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>
- - - - - - - - - - - - - - - - - - - - - - - - - - - -

Reply via email to