如何在XSLT转换中复制指定DOCTYPE声明?(XSLT3.0/4.0)
如何在XSLT 3.0/4.0转换中保留指定DOCTYPE声明
你用到的<xsl:output>配置本身是正确的,但要确保以下几个细节,才能让目标DOCTYPE声明正确输出:
关键注意事项
- 使用兼容XSLT 3.0+的处理器:比如Saxon(HE/PE/EE版本)完全支持
doctype-public和doctype-system属性,避免使用不支持新标准的老旧处理器。 - 保持根元素名称一致:你的DOCTYPE根是
topic,转换后的输出根元素必须仍是<topic>——如果转换过程中修改了根元素名称或替换了根节点,DOCTYPE声明会无法正确关联。 - 避免手动输出DOCTYPE:不要在模板里用
<xsl:text>或其他方式手动拼接DOCTYPE,依赖<xsl:output>是符合XML规范的标准做法,能避免格式错误。
完整XSLT示例
如果你的需求是原样复制输入文档并保留DOCTYPE,可使用以下样式表:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" encoding="UTF-8" indent="yes" doctype-public="-//OASIS//DTD DITA Topic//EN" doctype-system="topic.dtd"/> <xsl:template match="/"> <xsl:copy-of select="."/> </xsl:template> </xsl:stylesheet>
如果是自定义转换(比如修改文档内容但保留根元素),只需确保最终输出的根节点是<topic>,同时保留上述<xsl:output>配置即可。
内容的提问来源于stack exchange,提问作者oleksii.sapov-erlinger
相关产品推荐
相关产品推荐

