I'm trying to serialize nodes to an XML string, using Java extensions. I'm trying to avoid writing my own. I thought perhaps I could use the DOMSerializer in Xalan-J.
However, I'm having trouble calling certain methods. They're documented as existing, but Xalan-J is not finding them. For example, I can instantiate an OutputPropertiesFactory, but I can't call its getDefaultMethodProperties() method. And I can't instantiate a SerializerFactory at all. Here is my XML: <?xml version="1.0" encoding="utf-8"?> <greetings> <greeting xml:lang="en">hello!</greeting> <greeting xml:lang="es">¡hola!</greeting> <greeting xml:lang="fr">bonjour!</greeting> <greeting xml:lang="ru">Здравствуйте!</greeting> <greeting xml:lang="ja">今日は</greeting> </greetings> Here is my XSLT (the failure is when I try to create $formatprops): <?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:java="http://xml.apache.org/xalan/java"> <xsl:output method="text" indent="no"/> <xsl:template match="/"> <xsl:variable name="nodeset" select="/greetings"/> <!--OutputPropertiesFactory opropsfactory = new OutputPropertiesFactory();--> <xsl:variable name="opropsfactory" select="java:org.apache.xml.serializer.OutputPropertiesFactory.new()"/> <!--String method = org.apache.xml.serializer.Method.XML; Properties formatprops = opropsfactory.getDefaultMethodProperties(method);--> <xsl:variable name="formatprops" select="java:getDefaultMethodProperties($opropsfactory, 'xml')"/> <!--SerializerFactory serializerfactory = new SerializerFactory();--> <xsl:variable name="serializerfactory" select="java:org.apache.xml.serializer.SerializerFactory.new()"/> <!--Serializer serializer = serializerfactory.getSerializer(formatprops);--> <xsl:variable name="serializer" select="java:getSerializer($serializerfactory, $formatprops)"/> <!--StringWriter buffer = new StringWriter();--> <xsl:variable name="buffer" select="java:java.io.StringWriter.new()"/> <!--serializer.setWriter(buffer);--> <xsl:variable name="void1" select="java:setWriter($serializer, $buffer)"/> <!--DOMSerializer domserializer = serializer.asDOMSerializer();--> <xsl:variable name="domserializer" select="java:asDOMSerializer($serializer)"/> <!--domserializer.serialize(node);--> <xsl:variable name="void2" select="java:serialize($domserializer, $nodeset)"/> <!--System.out.write(buffer.toString());--> <xsl:value-of select="java:toString($buffer)"/> </xsl:template> </xsl:stylesheet> Here is how I am invoking Xalan-J, and the error message: C:\dev\test>java -Djava.endorsed.dirs=C:\dev\xalan-j_2_7_0 -cp C:\dev\xalan-j_2_7_0\xalan.jar;C:\dev\xalan-j_2_7_0\serializer.jar org.apache.xalan.xslt.Process -IN greetings.xml -XSL xalanserialize.xsl -EDUMP ; SystemID: file:///C:/dev/test/xalanserialize.xsl; Line#: 14; Column#: 103 javax.xml.transform.TransformerException: java.lang.NoSuchMethodException: For extension function, could not find method org.apache.xml.serializer.OutputPropertiesFactory.getDefaultMethodProperties([ExpressionContext,] #STRING). at org.apache.xalan.extensions.ExtensionHandlerJavaPackage.callFunction(ExtensionHandlerJavaPackage.java:420) at org.apache.xalan.extensions.ExtensionHandlerJavaPackage.callFunction(ExtensionHandlerJavaPackage.java:438) at org.apache.xalan.extensions.ExtensionsTable.extFunction(ExtensionsTable.java:220) at org.apache.xalan.transformer.TransformerImpl.extFunction(TransformerImpl.java:473) at org.apache.xpath.functions.FuncExtFunction.execute(FuncExtFunction.java:206) at org.apache.xpath.XPath.execute(XPath.java:335) at org.apache.xalan.templates.ElemVariable.getValue(ElemVariable.java:278) at org.apache.xalan.templates.ElemVariable.execute(ElemVariable.java:246) at org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(TransformerImpl.java:2411) at org.apache.xalan.transformer.TransformerImpl.applyTemplateToNode(TransformerImpl.java:2281) at org.apache.xalan.transformer.TransformerImpl.transformNode(TransformerImpl.java:1367) at org.apache.xalan.transformer.TransformerImpl.transform(TransformerImpl.java:709) at org.apache.xalan.transformer.TransformerImpl.transform(TransformerImpl.java:1284) at org.apache.xalan.transformer.TransformerImpl.transform(TransformerImpl.java:1262) at org.apache.xalan.xslt.Process.main(Process.java:1046) --------- java.lang.NoSuchMethodException: For extension function, could not find method org.apache.xml.serializer.OutputPropertiesFactory.getDefaultMethodProperties([ExpressionContext,] #STRING). at org.apache.xalan.extensions.MethodResolver.getMethod(MethodResolver.java:274) at org.apache.xalan.extensions.ExtensionHandlerJavaPackage.callFunction(ExtensionHandlerJavaPackage.java:381) at org.apache.xalan.extensions.ExtensionHandlerJavaPackage.callFunction(ExtensionHandlerJavaPackage.java:438) at org.apache.xalan.extensions.ExtensionsTable.extFunction(ExtensionsTable.java:220) at org.apache.xalan.transformer.TransformerImpl.extFunction(TransformerImpl.java:473) at org.apache.xpath.functions.FuncExtFunction.execute(FuncExtFunction.java:206) at org.apache.xpath.XPath.execute(XPath.java:335) at org.apache.xalan.templates.ElemVariable.getValue(ElemVariable.java:278) at org.apache.xalan.templates.ElemVariable.execute(ElemVariable.java:246) at org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(TransformerImpl.java:2411) at org.apache.xalan.transformer.TransformerImpl.applyTemplateToNode(TransformerImpl.java:2281) at org.apache.xalan.transformer.TransformerImpl.transformNode(TransformerImpl.java:1367) at org.apache.xalan.transformer.TransformerImpl.transform(TransformerImpl.java:709) at org.apache.xalan.transformer.TransformerImpl.transform(TransformerImpl.java:1284) at org.apache.xalan.transformer.TransformerImpl.transform(TransformerImpl.java:1262) at org.apache.xalan.xslt.Process.main(Process.java:1046) Exception in thread "main" java.lang.RuntimeException: java.lang.NoSuchMethodException: For extension function, could not find method org.apache.xml.serializer.OutputPropertiesFactory.getDefaultMethodProperties([ExpressionContext,] #STRING). at org.apache.xalan.xslt.Process.doExit(Process.java:1153) at org.apache.xalan.xslt.Process.main(Process.java:1126) If I try to create the SerializerFactory first, I get a similar error about its constructor not being found. Am I doing something wrong? Thanks, Mike