  | |  | Node-set to XML string via Java extensions in Xalan-J: possible? | Node-set to XML string via Java extensions in Xalan-J: possible? 2007-02-22 - By Mike Brown
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">Здравст& #1074;уйте!</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
|
|
 |