如何使用XSLT提取嵌套在XML标签内的ISO-8859-1编码XML内容
XSLT提取嵌套ISO-8859-1编码XML内容问题解决方案
问题根因
- 节点选择错误:当前XSLT中XPath表达式
select="XML"试图获取<return>标签下的<XML>子节点,但入站SOAP报文中的<return>标签直接存储转义后的XML文本,无<XML>子节点,因此无法匹配到内容,导致输出为空。 - 编码声明冲突:嵌套的XML内容头部声明为
ISO-8859-1编码,与预期输出的UTF-8编码不匹配,需要额外处理替换。
修正后的XSLT代码
<?xml version="1.0" encoding="UTF-8"?> <ns0:stylesheet version="2.0" xmlns="http://www.issnetonline.com.br/webservice/nfd" xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns0="http://www.w3.org/1999/XSL/Transform" xmlns:ns2="http://www.betha.com.br/e-nota-contribuinte-ws"> <!-- 指定输出配置:UTF-8编码、保留缩进、不自动添加XML声明 --> <ns0:output method="xml" encoding="UTF-8" indent="yes" omit-xml-declaration="yes"/> <ns0:template match="/env:Envelope/env:Body/ns2:GerarNfseResponse/return"> <!-- 输出符合预期的UTF-8编码XML头 --> <ns0:text disable-output-escaping="yes"><?xml version="1.0" encoding="UTF-8" standalone="yes"?>
</ns0:text> <!-- 读取return标签文本,移除原有ISO编码声明后输出,关闭转义还原XML结构 --> <ns0:value-of select="replace(., '<\?xml[^?]+\?>', '')" disable-output-escaping="yes"/> </ns0:template> </ns0:stylesheet>
核心修改说明
- 修正节点选择逻辑:直接读取
<return>标签的文本内容,而非不存在的<XML>子节点 - 明确输出配置:通过
xsl:output指定输出编码为UTF-8,避免默认编码异常 - 处理编码声明冲突:用XSLT 2.0的
replace函数移除原有嵌套XML的ISO-8859-1编码声明,统一输出符合要求的UTF-8编码声明 - 保留
disable-output-escaping配置:确保转义的XML标签被正确还原为可解析的XML结构
修改后运行即可得到你预期的输出结果。
内容的提问来源于stack exchange,提问作者Alexandre Rezende
相关产品推荐
相关产品推荐

