SOAP消息XML数组节点删除:XSLT失效原因排查请求
解决SOAP消息中按ActCode过滤empAccountsResponse元素的XSLT问题
看起来你的XSLT没达到预期效果主要是命名空间处理缺失和模板匹配/判断逻辑错误导致的,咱们一步步来修正:
问题分析
- 命名空间未声明:你的输入XML里用到了多个命名空间(比如
a:前缀对应的http://example.com),但原XSLT没有声明这些命名空间,导致XSLT无法正确匹配到目标元素。 - 模板匹配对象错误:你需要过滤的是
a:empAccountsResponse元素,但原模板匹配的是empResult,而且在empResult模板里直接判断ActCode是找不到这个子元素的(因为ActCode属于a:命名空间下的子节点)。 - 判断逻辑位置错误:应该针对每个
a:empAccountsResponse元素做判断,决定是否保留,而不是对整个empResult做判断。
修正后的XSLT代码
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:s="http://example.com" xmlns:a="http://example.com" xmlns:emp="http://example.com"> <!-- 身份转换模板,默认复制所有节点和属性 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- 匹配a:empAccountsResponse元素,根据ActCode过滤 --> <xsl:template match="a:empAccountsResponse"> <!-- 只保留ActCode为JHO或FFG的元素 --> <xsl:if test="a:ActCode = 'JHO' or a:ActCode = 'FFG'"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:if> </xsl:template> </xsl:stylesheet>
关键改动说明
- 声明所有必要命名空间:在
xsl:stylesheet根节点声明了s:、a:以及emp:(对应empResponse的命名空间),确保XSLT能正确识别XML中的带前缀元素。 - 目标元素精准匹配:新增模板匹配
a:empAccountsResponse,针对每个账号响应元素单独做过滤判断。 - 正确引用命名空间下的ActCode:判断条件里用
a:ActCode来定位目标字段,避免因命名空间缺失导致的节点查找失败。 - 保留身份转换模板:这个模板保证除了被过滤的元素外,其他所有节点(包括SOAP信封、头部、empResult容器等)都原样复制,符合你的期望输出结构。
验证效果
用这个修正后的XSLT处理你的输入XML,就能得到你想要的输出:只保留ActCode为JHO的a:empAccountsResponse元素,其余不符合条件的会被删除。
内容的提问来源于stack exchange,提问作者user5458829
相关产品推荐
相关产品推荐

