使用XSL将SOAP请求XML转换为普通标签XML遇到问题
解决SOAP XML转无命名空间前缀XML的XSLT方案
嘿,刚好我之前处理过类似的需求,给你一个直接能用的XSLT脚本,完美适配你的转换需求:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://testnamespace.org"> <!-- 匹配SOAP信封和Body,直接处理它们的子节点,跳过外层结构 --> <xsl:template match="SOAP-ENV:Envelope | SOAP-ENV:Body"> <xsl:apply-templates/> </xsl:template> <!-- 匹配所有元素,生成不带命名空间前缀的新元素 --> <xsl:template match="*"> <xsl:element name="{local-name()}"> <!-- 复制元素的所有属性(如果有的话) --> <xsl:apply-templates select="@* | node()"/> </xsl:element> </xsl:template> <!-- 复制文本、注释等节点 --> <xsl:template match="text() | comment() | processing-instruction()"> <xsl:copy/> </xsl:template> </xsl:stylesheet>
代码说明:
- 首先我们在XSLT里声明了SOAP和业务数据的命名空间,这样XSLT能正确识别输入XML里的带前缀元素
- 第一个模板专门匹配
SOAP-ENV:Envelope和SOAP-ENV:Body,直接应用子节点的模板,相当于把这两层外层结构“剥掉” - 核心的元素匹配模板用
local-name()获取元素的本地名称(去掉前缀的部分),生成新的无前缀元素 - 最后一个模板负责原样复制文本、注释等非元素节点,保证内容完整
测试效果:
把你提供的输入SOAP XML用这个XSLT转换后,就能得到你期望的结果:
<GetUserBalance> <userId>tonysin</userId> <currency>CNY</currency> </GetUserBalance> <loginToken>a1b2c3d4</loginToken>
如果你的业务数据命名空间有变化,只需要修改XSLT里的xmlns:ns1属性值就行,非常灵活。
内容的提问来源于stack exchange,提问作者chenchuen
相关产品推荐
相关产品推荐

