提问人:RFA 提问时间:11/7/2023 更新时间:11/9/2023 访问量:34
XSLT 将现有的 !实体引用<!XML 的 DOCTYPE >
XSLT to put existing !ENTITY refs inside <!DOCTYPE > of XML
问:
我已经查看了现有的问题/答案,但没有一个是完全相同的问题,或者没有给出答案。 我有一个现有的XML文档
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE thing PUBLIC "XXX//DTD XML DTD for things//EN" "C:\work\thing.dtd" [<!ENTITY abreve "ă"><!ENTITY agr "α"><!ENTITY amacr "ā"><!ENTITY bgr "β">]>
<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 内容。 谢谢。
答:
0赞
Michael Kay
11/7/2023
#1
恐怕 XSLT 不能很好地与 DTD 配合使用。在标准 XSLT 中,无法读取输入文档的 DTD 或写入输出文档的 DTD,也无法防止输入中的实体和字符引用被扩展(并因此丢失)。有一些技巧可以解决其中一些限制,但没有一个是非常令人满意的。
评论
saxon:internal-dtd-subset