我正在使用 Saxon-He 来处理此代码(我使用 this post 来了解这个想法):
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:key name="elelsById" match="elel" use="@elelEntity" />
<xsl:template match="/">
<xsl:text disable-output-escaping="yes">
<!DOCTYPE dmodule [
</xsl:text>
<xsl:text disable-output-escaping="yes"><!NOTATION cgm PUBLIC "-//USA-DOD//NOTATION Computer Graphics Metafile//EN">
</xsl:text>
<xsl:for-each select="//elel[generate-id() = generate-id(key('elelsById', @elelEntity)[1])]">
<xsl:text disable-output-escaping="yes"><!ENTITY </xsl:text>
<xsl:value-of select="@elelEntity" />
<xsl:text> SYSTEM "</xsl:text>
<xsl:value-of select="@elelEntity" />
<xsl:text disable-output-escaping="yes">.cgm" NDATA cgm >
</xsl:text>
</xsl:for-each>
<xsl:text disable-output-escaping="yes">]>
</xsl:text>
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
我的输出如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dmodule [
<!NOTATION cgm PUBLIC "-//USA-DOD//NOTATION Computer Graphics Metafile//EN">
<!ENTITY ELEL-A-01 SYSTEM "ELEL-A-01.cgm" NDATA cgm >
<!ENTITY ELEL-A-05 SYSTEM "ELEL-A-05.cgm" NDATA cgm >
]>
<!-- xml content -->
我期待
<
和>
会被替换为<
和>
我删除了
disable-output-escaping="yes"
,结果是一样的。
我看到 Saxon 包含此扩展
saxon:doctype
,但它仅适用于 Saxon-PE 或 Saxon-EE。
我在实施中缺少什么?
如果您让 Saxon 序列化结果,以便它可以考虑 DOE,那么您的代码应该可以工作;如果这不起作用,通常意味着您正在使用 DOM 或 XDM 树等转换目标,而不是文件或流。
您可以看到 您的代码的一部分与 Saxon HE 一起在线使用。结果有例如
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dmodule [
<!NOTATION cgm PUBLIC "-//USA-DOD//NOTATION Computer Graphics Metafile//EN">
]>
<dmodule>...</dmodule>