4

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>

解決済み

適切な場所で私の回答を参照してください(回答で!)

4

3 に答える 3

5
DOMResult output = new DOMResult();
TransformerFactory.newInstance().
                   newTransformer(new StreamSource(xsl)).
                   transform(input, output);
return (Document) output.getNode();

参考:
DOMResult#getNode()

結果の DOM ツリーを含むノードを取得します。DOMResult(Node node), ... を介してノードが設定されていない場合、ノードは変換によって設定され、変換が完了するとこのメソッドから取得できます。

于 2013-07-05T20:20:09.370 に答える