You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用XSLT校验XML声明及DOCTYPE相关规则?

用XSLT校验XML声明与DOCTYPE的实现代码

以下是满足需求的XSLT 1.0代码,可用于校验XML的声明部分:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" encoding="UTF-8"/>

    <!-- 主模板,触发校验逻辑 -->
    <xsl:template match="/">
        <xsl:call-template name="check-xml-declaration"/>
        <xsl:call-template name="check-doctype"/>
    </xsl:template>

    <!-- 校验XML声明(注:XSLT无法直接检测声明是否存在,但可验证版本和编码符合预期) -->
    <xsl:template name="check-xml-declaration">
        <xsl:variable name="xml-version" select="system-property('xml-version')"/>
        <xsl:variable name="encoding" select="system-property('encoding')"/>
        
        <xsl:choose>
            <xsl:when test="$xml-version = '1.0' and $encoding = 'UTF-8'">
                <xsl:text>XML声明校验通过:版本1.0,编码UTF-8</xsl:text>
            </xsl:when>
            <xsl:otherwise>
                <xsl:text>XML声明校验失败:版本或编码不符合要求,或未声明</xsl:text>
            </xsl:otherwise>
        </xsl:choose>
        <xsl:text>&#10;</xsl:text>
    </xsl:template>

    <!-- 校验DOCTYPE存在及指定DTD -->
    <xsl:template name="check-doctype">
        <xsl:variable name="doctype" select="/*/preceding-sibling::DOCTYPE"/>
        <xsl:variable name="target-dtd" select="'JATS-archivearticle1-mathml3.dtd'"/>

        <xsl:choose>
            <xsl:when test="$doctype">
                <xsl:choose>
                    <xsl:when test="$doctype/@system = $target-dtd">
                        <xsl:text>DOCTYPE校验通过:包含指定DTD </xsl:text>
                        <xsl:value-of select="$target-dtd"/>
                    </xsl:when>
                    <xsl:otherwise>
                        <xsl:text>DOCTYPE校验失败:未使用指定DTD,当前DTD为 </xsl:text>
                        <xsl:value-of select="$doctype/@system"/>
                    </xsl:otherwise>
                </xsl:choose>
            </xsl:when>
            <xsl:otherwise>
                <xsl:text>DOCTYPE校验失败:未找到DOCTYPE声明</xsl:text>
            </xsl:otherwise>
        </xsl:choose>
        <xsl:text>&#10;</xsl:text>
    </xsl:template>
</xsl:stylesheet>

代码说明:

  • XML声明校验:XSLT处理器解析XML后会丢弃XML声明节点,无法直接判断声明是否存在,但可通过system-property()获取解析时使用的XML版本和编码,以此验证是否符合version="1.0" encoding="UTF-8"的要求。若校验不通过,说明要么无声明,要么声明的版本/编码不符合规范。
  • DOCTYPE校验:通过/*/preceding-sibling::DOCTYPE定位文档的DOCTYPE节点,检查其system属性是否匹配目标DTD文件名,同时判断DOCTYPE节点是否存在。

使用方式:

将上述XSLT文件与待校验XML放在同一目录,用支持XSLT的工具(如Saxon、Xalan)执行转换,即可得到纯文本格式的校验结果。

内容的提问来源于stack exchange,提问作者BWin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 00:36:27