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: ===== </xsl:text>
<xsl:call-template name="serialize-xml-via-JAXP"/>
<xsl:text> org.apache.xml.serializer.DOMSerializer: ======================================== </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),
' ', '')"/>
</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>