cXML文件XSLT解析失败排查及目标转换XSLT获取
解决cXML解析失败并实现指定转换的XSLT方案
一、先搞定解析失败的问题
你遇到的SAXParseException报错,核心原因是解析器尝试加载远程的cXML DTD(http://xml.cxml.org/schemas/cXML/1.2.046/cXML.dtd)时,要么网络访问出问题,要么加载后的DTD内容格式不符合解析要求。这里给你两个可行的解决思路:
方法1:修改cXML的DOCTYPE声明,跳过DTD验证
把原cXML里的DOCTYPE行改成:<!DOCTYPE cXML SYSTEM "http://xml.cxml.org/schemas/cXML/1.2.046/cXML.dtd" [<!ENTITY % ignore "IGNORE">%ignore;]>或者直接删除整个DOCTYPE声明,这样解析器就不会去加载和验证外部DTD了。
方法2:在XSLT处理时关闭DTD验证
如果是用Java等语言调用XSLT处理器,可以配置解析器参数,比如设置http://apache.org/xml/features/nonvalidating/load-external-dtd为false(禁止加载外部DTD),或者设置http://xml.org/sax/features/validation为false(关闭整体验证)。具体配置代码要看你使用的处理框架(比如Xalan、Saxon)。
二、实现转换的XSLT代码
下面是能把你提供的cXML转换成目标RESULT结构的XSLT代码,可配合上面的解析方案直接使用:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 去除不必要的空格和换行,让输出更整洁 --> <xsl:strip-space elements="*"/> <xsl:output method="xml" indent="yes" encoding="UTF-8"/> <!-- 匹配根节点cXML --> <xsl:template match="/cXML"> <RESULT> <!-- 提取Response节点下Status的文本内容 --> <Status> <xsl:value-of select="Response/Status/text()"/> </Status> </RESULT> </xsl:template> </xsl:stylesheet>
这个XSLT会精准提取目标文本,生成你需要的<RESULT>结构,输出的XML格式也会保持整洁。
内容的提问来源于stack exchange,提问作者Yatan
相关产品推荐
相关产品推荐

