  | |  | 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
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>
|
|
 |