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">&#161;hola!</greeting>
  <greeting xml:lang="fr">bonjour!</greeting>
  <greeting 
xml:lang="ru">&#1047;&#1076;&#1088;&#1072;&#1074;&#1089;&#1090;&#1074;&#1091;&#1081;&#1090;&#1077;!</greeting>
  <greeting xml:lang="ja">&#20170;&#26085;&#12399;</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

Reply via email to