【问题标题】:JAVA DOM API Processing inscrution and doctype before XML prologXML prolog 之前的 JAVA DOM API 处理指令和文档类型
【发布时间】:2025-12-20 00:45:11
【问题描述】:

我正在用 JAVA 开发 DOM API,我有一个问题,我该如何添加 Precessing Instruction(XSLT 样式表)和 DOCTYPE(文档类型) XML Prolog
请每一个换行?

例如:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE FICHES SYSTEM "docform.dtd">
<?xml-stylesheet type="text/xsl" href="stylesheet.xsl"?>

【问题讨论】:

    标签: java api xslt dom doctype


    【解决方案1】:

    您需要在创建文档时创建 DOCTYPE,参见http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-102161490,它在实现上定义了一个方法 createDocumentType 来创建一个 DOCTYPE 和一个方法 createDocument 来创建一个以 DOCTYPE 作为一个参数的文档。

    所以你需要

    DocumentType docType = implementation.createDocumentType("FICHES", null, "docform.dtd");
    Document doc = implementation.createDocument(null, "FICHES", docType);
    

    这样你现在就有了一个 DOM 文档 doc,其中包含一个 DOCTYPE 节点和一个名为 FICHES 的根元素,然后你可以创建并插入处理指令:

    doc.insertBefore(doc.createProcessingInstruction("xml-stylesheet", "type=\"text/xsl\" href=\"stylesheet.xsl\""), doc.getDocumentElement());
    

    【讨论】:

    • 谢谢Martin,但是经过测试DocumentType不起作用,根本没有doctype声明。对于处理指令,它可以工作,但它是与 XML Prolog 在同一行中添加的。
    • 我没有看到新行的要求,这可能很难实现,因为我认为 DOM API 不允许在根元素之前插入空格进行格式化。至于 DOCTYPE,你如何检查根本没有 doctype?我认为您需要使用 LSSerializer 来编写 DOM 文档,使用默认转换器可能不会输出任何 DOCTYPE,因为 XSLT 不知道该节点类型。