Kevin Cormier wrote:
> The getDefaultMethodProperties(String method) method of the
> org.apache.xml.serializer.OutputPropertiesFactory class is static, so you
> can't call it on the instance that you've created.  You can call it like
> this:
> 
> <xsl:variable name="formatprops"
> select="java:org.apache.xml.serializer.OutputPropertiesFactory.getDefaultMethodProperties('xml')"/>
> 
> As for the SerializerFactory, its constructor is private, so it can't be
> instantiated directly.  You have to use the static getSerializer(Properties
> format) method to obtain an instance.

Ah! Thank you! That was exactly what I needed. I knew I must've overlooked 
something. Here's XSLT demonstrating both the pure-JAXP and DOMSerializer 
methods. I couldn't find a SAXSerializer in the Xalan 2.7.1 distribution.

<?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"/>

        <xsl:template match="/">
                <xsl:text>JAXP:&#10;=====&#10;</xsl:text>
                <xsl:call-template name="serialize-xml-via-JAXP"/>
                
<xsl:text>&#10;&#10;org.apache.xml.serializer.DOMSerializer:&#10;========================================&#10;</xsl:text>
                <xsl:call-template name="serialize-xml-via-DOMSerializer"/>
        </xsl:template>

        <xsl:template name="serialize-xml-via-JAXP">
                <!--TransformerFactory tfactory = new 
TransformerFactory.newInstance();-->
                <xsl:variable name="tfactory" 
select="java:javax.xml.transform.TransformerFactory.newInstance()"/>
                <!--Transformer t = tfactory.newTransformer();-->
                <xsl:variable name="t" select="java:newTransformer($tfactory)"/>
                <!--DOMSource isrc = new DOMSource(nodeset);-->
                <xsl:variable name="isrc" 
select="java:javax.xml.transform.dom.DOMSource.new(.)"/>
                <!--StringWriter buffer = new StringWriter();-->
                <xsl:variable name="buffer" 
select="java:java.io.StringWriter.new()"/>
                <!--StreamResult result = new StreamResult(buffer);-->
                <xsl:variable name="result" 
select="java:javax.xml.transform.stream.StreamResult.new($buffer)"/>
                <!--t.transform(isrc, result)-->
                <xsl:variable name="void0" select="java:transform($t, $isrc, 
$result)"/>
                <!--System.out.write(buffer.toString());-->
                <!--Also clean up newlines-->
                <xsl:value-of select="translate(java:toString($buffer), 
'&#13;', '')"/>
        </xsl:template>

        <xsl:template name="serialize-xml-via-DOMSerializer">
                <!--String method = org.apache.xml.serializer.Method.XML;
                    Properties formatprops = 
OutputPropertiesFactory.getDefaultMethodProperties(method);-->
                <xsl:variable name="formatprops" 
select="java:org.apache.xml.serializer.OutputPropertiesFactory.getDefaultMethodProperties('xml')"/>
                <!--Serializer serializer = 
SerializerFactory.getSerializer(formatprops);-->
                <xsl:variable name="serializer" 
select="java:org.apache.xml.serializer.SerializerFactory.getSerializer($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, .)"/>
                <!--System.out.write(buffer.toString());-->
                <xsl:value-of select="java:toString($buffer)"/>
        </xsl:template>

</xsl:stylesheet>

Reply via email to