删除XML数组中的节点

时间:2018-01-19 15:45:25

标签: xml xslt

我有一个传入的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>

1 个答案:

答案 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>

行动中的示例:http://xsltfiddle.liberty-development.net/jyyiVhn