XSLT 将现有的 !实体引用<!XML 的 DOCTYPE >

XSLT to put existing !ENTITY refs inside <!DOCTYPE > of XML

提问人:RFA 提问时间:11/7/2023 更新时间:11/9/2023 访问量:34

问:

我已经查看了现有的问题/答案,但没有一个是完全相同的问题,或者没有给出答案。 我有一个现有的XML文档

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE thing PUBLIC "XXX//DTD XML DTD for things//EN" "C:\work\thing.dtd" [<!ENTITY abreve "&#x103;"><!ENTITY agr "&#945;"><!ENTITY amacr "&#x101;"><!ENTITY bgr "&#946;">]>
    <thing>
    [...]
    </thing>

我使用此 XSLT 以另一种不相关的方式更改文档,效果很好:

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/asset" priority="10">
    [...]
    <output method="xml" omit-xml-declaration="no" indent="no" encoding="UTF-8" doctype-public="XXX//DTD XML DTD for things//EN" doctype-system="C:\work\thing.dtd"/>
    [...]

但输出没有给出 ENTITY 项,只是这个:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE thing PUBLIC "XXX//DTD XML DTD for things//EN" "C:\work\thing.dtd">
    <thing>
    [...]
    </thing>

如果需要,该解决方案可以从文件中读取 ENTITY 内容,但不必这样做,因为它在所有情况下都是相同的,因此它可以重新输入 ENTITY 内容。 谢谢。

XML XSLT 实体 文档类型

评论

0赞 michael.hor257k 11/7/2023
以下是为什么您不需要这样做的解释:stackoverflow.com/a/62288452/17153010。这里有一些想法,无论如何你都可以做到这一点: stackoverflow.com/q/5985615/17153010
0赞 Martin Honnen 11/7/2023
Saxon 有一些扩展,例如作为序列化参数 saxonica.com/html/documentation11/extensions/output-extras/...,或者像扩展指令 saxonica.com/html/documentation11/extensions/instructions/...。也许,如果您将 XSLT 与 XML IDE 一起使用,例如 Stylus Studio 或 oXygen XML 编辑器,则可以使用 Saxon 的商业 PE 和/或 EE 版本,否则您将需要购买 Saxon PE 或 EE 许可证。saxon:internal-dtd-subset

答:

0赞 Michael Kay 11/7/2023 #1

恐怕 XSLT 不能很好地与 DTD 配合使用。在标准 XSLT 中,无法读取输入文档的 DTD 或写入输出文档的 DTD,也无法防止输入中的实体和字符引用被扩展(并因此丢失)。有一些技巧可以解决其中一些限制,但没有一个是非常令人满意的。