我有一个传入的SOAP消息,我需要根据某些搜索条件删除某些记录,如字段“ActCode”。如果此字段与给定的值列表不匹配,那么我需要从Array“empResult”中删除该特定元素“a:empAccountsResponse”。我的XSLT没有按预期工作。
请告诉我导致问题的原因。
输入XML:
<s:Envelope xmlns:s="http://example.com">
<s:Header></s:Header>
<s:Body>
<empResponse xmlns="http://example.com">
<empResult xmlns:i="http://example.com" xmlns:a="http://example.com">
<a:empAccountsResponse i:type="b:empResponse" xmlns:b="http://example.com">
<a:status>Active</a:status>
<a:ActCode>JHO</a:ActCode>
<a:pId>WQT</a:pId>
</a:empAccountsResponse>
<a:empAccountsResponse i:type="b:empResponse" xmlns:b="http://example.com">
<a:status>Active</a:status>
<a:ActCode>TDD</a:ActCode>
<a:pId>TDD</a:pId>
</a:empAccountsResponse>
</empResult>
</empResponse>
</s:Body>
</s:Envelope>
输出:
<s:Envelope xmlns:s="http://example.com">
<s:Header></s:Header>
<s:Body>
<empResponse xmlns="http://example.com">
<empResult xmlns:i="http://example.com" xmlns:a="http://example.com">
<a:empAccountsResponse i:type="b:empResponse" xmlns:b="http://example.com">
<a:status>Active</a:status>
<a:ActCode>JHO</a:ActCode>
<a:pId>WQT</a:pId>
</a:empAccountsResponse>
</empResult>
</empResponse>
</s:Body>
</s:Envelope>
XSLT代码:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="empResult">
<xsl:if test="ActCode = 'JHO' or ActCode = 'FFG'">
<xsl:copy-of select="."/>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
答案 0 :(得分:0)
问题是您的模板匹配empResult
并检查名为ActCode
的子项。
首先出现的问题是,empResult
永远不会匹配任何内容,因为empResult
位于默认名称空间http://example.com
中。
第二件事是错误的,即使你考虑了默认命名空间,以及ActCode
在命名空间中的事实(它应该是a:ActCode
),{{1}的唯一子节点1}}是empResult
。
您需要匹配的是a:empAccountsResponse
...
a:empAccountsResponse
我还认为添加一个空模板来删除元素更干净,而不是复制你要保留的元素...
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:a="http://example.com">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="a:empAccountsResponse">
<xsl:if test="a:ActCode = 'JHO' or a:ActCode = 'FFG'">
<xsl:copy-of select="."/>
</xsl:if>
</xsl:template>
</xsl:stylesheet>