如何使用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> </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> </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
相关产品推荐
相关产品推荐

