我正在使用 Saxon-He 来处理此代码(我使用这篇文章来了解这个想法):
<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 -->
我原本以为<
and>
会被替换为<
and>
我删除了disable-output-escaping="yes"
,结果是一样的。
我看到 Saxon 包含这个扩展saxon:doctype
,但它仅适用于 Saxon-PE 或 Saxon-EE。
我的实施过程中缺少了什么?
如果您让 Saxon 序列化结果以便可以考虑 DOE,那么您的代码应该可以正常工作;如果这不起作用,通常意味着您正在使用转换目标(如 DOM 或 XDM 树),而不是文件或流。
您可以看到部分代码与 Saxon HE 一起在线运行。结果如下