次のコードを使用して、大きな xml ストリームを別のストリームに変換しています。
import java.io.ByteArrayInputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.Writer;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLEventWriter;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLOutputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import javax.xml.stream.events.XMLEvent;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stax.StAXResult;
import javax.xml.transform.stax.StAXSource;
public class TryMe
{
public static void main (final String[] args)
{
XMLInputFactory inputFactory = null;
XMLEventReader eventReaderXSL = null;
XMLEventReader eventReaderXML = null;
XMLOutputFactory outputFactory = null;
XMLEventWriter eventWriter = null;
Source XSL = null;
Source XML = null;
inputFactory = XMLInputFactory.newInstance();
outputFactory = XMLOutputFactory.newInstance();
inputFactory.setProperty("javax.xml.stream.isSupportingExternalEntities", Boolean.TRUE);
inputFactory.setProperty("javax.xml.stream.isNamespaceAware", Boolean.TRUE);
inputFactory.setProperty("javax.xml.stream.isReplacingEntityReferences", Boolean.TRUE);
try
{
eventReaderXSL = inputFactory.createXMLEventReader("my_template",
new InputStreamReader(TryMe.class.getResourceAsStream("my_template.xsl")));
eventReaderXML = inputFactory.createXMLEventReader("big_one", new InputStreamReader(
TryMe.class.getResourceAsStream("big_one.xml")));
}
catch (final javax.xml.stream.XMLStreamException e)
{
System.out.println(e.getMessage());
}
// get a TransformerFactory object
final TransformerFactory transfFactory = TransformerFactory.newInstance();
// define the Source object for the stylesheet
try
{
XSL = new StAXSource(eventReaderXSL);
}
catch (final javax.xml.stream.XMLStreamException e)
{
System.out.println(e.getMessage());
}
Transformer tran2 = null;
// get a Transformer object
try
{
tran2 = transfFactory.newTransformer(XSL);
}
catch (final javax.xml.transform.TransformerConfigurationException e)
{
System.out.println(e.getMessage());
}
// define the Source object for the XML document
try
{
XML = new StAXSource(eventReaderXML);
}
catch (final javax.xml.stream.XMLStreamException e)
{
System.out.println(e.getMessage());
}
// create an XMLEventWriter object
try
{
eventWriter = outputFactory.createXMLEventWriter(new OutputStreamWriter(System.out));
}
catch (final javax.xml.stream.XMLStreamException e)
{
System.out.println(e.getMessage());
}
// define the Result object
final Result XML_r = new StAXResult(eventWriter);
// call the transform method
try
{
tran2.transform(XML, XML_r);
}
catch (final javax.xml.transform.TransformerException e)
{
System.out.println(e.getMessage());
}
// clean up
try
{
eventReaderXSL.close();
eventReaderXML.close();
eventWriter.close();
}
catch (final javax.xml.stream.XMLStreamException e)
{
System.out.println(e.getMessage());
}
}
}
my_template は次のようなものです。
<xsl:stylesheet version = '1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:preserve-space elements="*"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@k8[parent::point]">
<xsl:attribute name="k8">
<xsl:value-of select="'xxxxxxxxxxxxxx'"/>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
そしてxmlは長い長いリストです
<data>
<point .... k8="blablabla" ... ></point>
<point .... k8="blablabla" ... ></point>
<point .... k8="blablabla" ... ></point>
....
<point .... k8="blablabla" ... ></point>
</data>
入力ストリームの処理中に恒等変換器を使用すると ( transFactory(XSL) の代わりに tranfsFactory.newTransformer() を使用)、出力が生成されます。代わりに、私のテンプレートでは方法がありません..トランスフォーマーはすべての入力を読み取り、出力の生成を開始します(もちろん、大きなストリームでは、結果の前にメモリ不足が発生することがよくあります.
何か案が??私はおかしくなりました..コード/xsltの何が問題なのか理解できません
よろしくお願いします!