java.lang.NullPointerException
次のコードの行のコメントを外すと、次のようになります。
private static Document XSLT(String name) throws Exception{
File xsl = new File("data/" + name + ".xsl");
File xml = new File("data/" + name + ".xml");
DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document document = db.newDocument();
DOMSource input = new DOMSource(db.parse(xml));
StreamResult output = new StreamResult(System.out); //That works but its not what I want!
//DOMResult output = new DOMResult(document); //that gives the null pointer exception
TransformerFactory.newInstance().newTransformer(new StreamSource(xsl)).transform(input, output);
return document;
}
私の意図は、XSLT と Java 言語の両方を使用して、XML ファイルを変換するのに役立つようなメソッドを作成することです。結局、ファイルに保存する前にすべての変換を行う必要があります。
そのメソッドからドキュメントを取得する方法は?
つまり、変換されたドキュメントをファイルに保存してロードできるようにせずにこれを実行したいのですが、「メモリ」で実行したいのです。
ありがとうございました :)
アップデート
あなたが私をより良く助けることができるように、例外を公開させてください.
Exception in thread "main" javax.xml.transform.TransformerException: java.lang.NullPointerException
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:736)
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:340)
at test.Main.XSLT(Main.java:393)
at test.Main.test(Main.java:342)
at test.Main.main(Main.java:329)
Caused by: java.lang.NullPointerException
at com.sun.org.apache.xml.internal.serializer.SerializerBase.patchName(SerializerBase.java:271)
at com.sun.org.apache.xml.internal.serializer.SerializerBase.addAttribute(SerializerBase.java:429)
at com.sun.org.apache.xml.internal.serializer.ToSAXHandler.addUniqueAttribute(ToSAXHandler.java:438)
at xmlname.template$dot$0()
at xmlname.applyTemplates()
at xmlname.transform()
at com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet.transform(AbstractTranslet.java:611)
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:729)
... 4 more
---------
java.lang.NullPointerException
at com.sun.org.apache.xml.internal.serializer.SerializerBase.patchName(SerializerBase.java:271)
at com.sun.org.apache.xml.internal.serializer.SerializerBase.addAttribute(SerializerBase.java:429)
at com.sun.org.apache.xml.internal.serializer.ToSAXHandler.addUniqueAttribute(ToSAXHandler.java:438)
at xmlname.template$dot$0()
at xmlname.applyTemplates()
at xmlname.transform()
at com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet.transform(AbstractTranslet.java:611)
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:729)
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:340)
at test.Main.XSLT(Main.java:393)
at test.Main.test(Main.java:342)
at test.Main.main(Main.java:329)
更新 2
一般的なソースでテストしてみましょう。
test.xml
<?xml version="1.0" encoding="UTF-8"?>
<tests>
<test>
<text>Hi!</text>
</test>
</tests>
test.xsl
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output
method="html"
version="1.0"
encoding="utf-8"
indent="yes"
omit-xml-declaration="no"
media-type="application/xml"
doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
/>
<xsl:template match="/">
<html xmlns="http://www.w3.org/1999/xhtml" lang="pt-BR" xml:lang="pt-BR">
<head>
<meta charset="UTF-8" />
<title>Test</title>
</head>
<body>
<h1>Test</h1>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
<xsl:template match="/tests/test">
<p><xsl:value-of select="text"/></p>
</xsl:template>
</xsl:stylesheet>
を使用すると、次の出力が得られますStreamResult
。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html lang="pt-BR" xml:lang="pt-BR" xmlns="http://www.w3.org/1999/xhtml">
<head>
<META http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta charset="UTF-8">
<title>Test</title>
</head>
<body>
<h1>Test</h1>
<p>Hi!</p>
</body>
</html>
解決済み
適切な場所で私の回答を参照してください(回答で!)