如何解决第三方服务响应中空xmlns导致XSLT转换失败问题?
解决XSLT因空xmlns属性无法匹配元素的问题
这个问题我之前也碰到过!核心原因是第三方返回的IthalatBeyannameler元素带有xmlns=""属性,这会强制该元素及其所有子元素属于空命名空间,不再继承父级的ns0命名空间——你的XSLT里一直用ns0:前缀选择元素,自然就匹配不到了。
给你几个可行的解决办法:
方案一:为空命名空间绑定前缀(推荐)
在你的XSLT根元素里添加空命名空间的前缀声明,比如绑定为ns1,然后用这个前缀去匹配IthalatBeyannameler及其子元素。修改后的XSLT代码如下:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns0="原ns0命名空间的URL" <!-- 保留原有的ns0声明 --> xmlns:ns1="" <!-- 新增空命名空间的前缀绑定 --> xmlns:tns="你的tns命名空间URL"> <!-- 保留原有的tns声明 --> <xsl:template match="/"> <tns:KalemMarkaList> <xsl:for-each select="/ns0:AntrepoCikisDigerResponse/ns0:AntrepoCikisDigerResult/ns1:IthalatBeyannameler/ns1:IthalatBeyanname"> <tns:KalemMarka> <tns:Sasi/> <tns:MaviRef> <xsl:value-of select="ns1:MaviRef"/> </tns:MaviRef> <tns:MusteriIsNo> <xsl:value-of select="ns1:MusteriIsNo"/> </tns:MusteriIsNo> <tns:Yil> <xsl:value-of select="ns1:Yil"/> </tns:Yil> </tns:KalemMarka> </xsl:for-each> </tns:KalemMarkaList> </xsl:template> </xsl:stylesheet>
注意:要把代码里的原ns0命名空间的URL和你的tns命名空间URL替换成你实际使用的命名空间地址。
方案二:用local-name()忽略命名空间匹配
如果不想额外绑定前缀,也可以通过匹配元素的本地名称来绕过命名空间问题。这种方式适合临时快速解决,但如果XML里有同名元素在不同命名空间,可能会误匹配:
<xsl:template match="/"> <tns:KalemMarkaList> <xsl:for-each select="//*[local-name()='IthalatBeyannameler']/*[local-name()='IthalatBeyanname']"> <tns:KalemMarka> <tns:Sasi/> <tns:MaviRef> <xsl:value-of select="*[local-name()='MaviRef']"/> </tns:MaviRef> <tns:MusteriIsNo> <xsl:value-of select="*[local-name()='MusteriIsNo']"/> </tns:MusteriIsNo> <tns:Yil> <xsl:value-of select="*[local-name()='Yil']"/> </tns:Yil> </tns:KalemMarka> </xsl:for-each> </tns:KalemMarkaList> </xsl:template>
方案三:要求第三方修复响应(最根本)
其实这个xmlns=""属性是多余的,属于第三方服务的返回错误——如果能联系到第三方,让他们移除这个空命名空间属性,你的原XSLT代码就能直接正常工作,这是最彻底的解决方式。
内容的提问来源于stack exchange,提问作者ömer şahin
相关产品推荐
相关产品推荐

