根据另一个节点值从XML中删除选定的重复节点

时间:2014-05-14 16:13:01

标签: xml xslt

我是XSLT的新手,所以如果我发布了一个简单的问题,请不要介意  我有一个XML文件,我想根据其他节点的值删除一些选定的重复节点  我在此链接上找到了部分解决方案:" Remove elements based on other element's value -- XSLT"

我将上述解决方案应用于我的XML,但它删除了所有标记而不管其值如何 我想删除所有相应的SchemeNm标签,以下标签具有以下值:

  • Cdtr / Ctry =" US"
  • RmtInf / Strd /../ CdOrPrtry / Cd =" UK"

不应删除不符合上述条件的其他SchemeNm标签。

输入XML:

<PmtInf>
    <CdtTrfTxInf>
        <Cdtr>
           <Nm>US</Nm>
           <PstlAdr>
              <Ctry>US</Ctry>
              <AdrLine>ABC</AdrLine>
           </PstlAdr>
        </Cdtr>
        <CdtrAcct>
           <Id>
              <Othr>
                 <Id>12345678</Id>
                 <SchmeNm>
                    <Cd>ABCD</Cd>
                 </SchmeNm>
              </Othr>
           </Id>
        </CdtrAcct>
        <RmtInf>
            <Strd>
              <CdtrRefInf>
                 <Tp>
                    <CdOrPrtry>
                       <Cd>UK</Cd>
                    </CdOrPrtry>
                 </Tp>
              </CdtrRefInf>
           </Strd>
        </RmtInf>
     </CdtTrfTxInf>
     <CdtTrfTxInf>
        <Cdtr>
           <Nm>US</Nm>
           <PstlAdr>
              <Ctry>DK</Ctry>
              <AdrLine>ABC</AdrLine>
           </PstlAdr>
        </Cdtr>
        <CdtrAcct>
           <Id>
              <Othr>
                 <Id>12345678</Id>
                 <SchmeNm>
                    <Cd>ABCD</Cd>
                 </SchmeNm>
              </Othr>
           </Id>
        </CdtrAcct>
        <RmtInf>
            <Strd>
              <CdtrRefInf>
                 <Tp>
                    <CdOrPrtry>
                       <Cd>USA</Cd>
                    </CdOrPrtry>
                 </Tp>
              </CdtrRefInf>
           </Strd>
        </RmtInf>
     </CdtTrfTxInf>
  </PmtInf>

预期产出:

    <PmtInf>
    <CdtTrfTxInf>
        <Cdtr>
           <Nm>US</Nm>
           <PstlAdr>
              <Ctry>US</Ctry>
              <AdrLine>ABC</AdrLine>
           </PstlAdr>
        </Cdtr>
        <CdtrAcct>
           <Id>
              <Othr>
                 <Id>12345678</Id>
              </Othr>
           </Id>
        </CdtrAcct>
        <RmtInf>
            <Strd>
              <CdtrRefInf>
                 <Tp>
                    <CdOrPrtry>
                       <Cd>UK</Cd>
                    </CdOrPrtry>
                 </Tp>
              </CdtrRefInf>
           </Strd>
        </RmtInf>
     </CdtTrfTxInf>
     <CdtTrfTxInf>
        <Cdtr>
           <Nm>US</Nm>
           <PstlAdr>
              <Ctry>DK</Ctry>
              <AdrLine>ABC</AdrLine>
           </PstlAdr>
        </Cdtr>
        <CdtrAcct>
           <Id>
              <Othr>
                 <Id>12345678</Id>
                 <SchmeNm>
                    <Cd>ABCD</Cd>
                 </SchmeNm>
              </Othr>
           </Id>
        </CdtrAcct>
        <RmtInf>
            <Strd>
              <CdtrRefInf>
                 <Tp>
                    <CdOrPrtry>
                       <Cd>USA</Cd>
                    </CdOrPrtry>
                 </Tp>
              </CdtrRefInf>
           </Strd>
        </RmtInf>
     </CdtTrfTxInf>
  </PmtInf>

1 个答案:

答案 0 :(得分:1)

identity transform开头,然后匹配您要删除的元素。

示例:

XML输入

<PmtInf>
    <CdtTrfTxInf>
        <Cdtr>
            <Nm>US</Nm>
            <PstlAdr>
                <Ctry>US</Ctry>
                <AdrLine>ABC</AdrLine>
            </PstlAdr>
        </Cdtr>
        <CdtrAcct>
            <Id>
                <Othr>
                    <Id>12345678</Id>
                    <SchmeNm>
                        <Cd>ABCD</Cd>
                    </SchmeNm>
                </Othr>
            </Id>
        </CdtrAcct>
        <RmtInf>
            <Strd>
                <CdtrRefInf>
                    <Tp>
                        <CdOrPrtry>
                            <Cd>UK</Cd>
                        </CdOrPrtry>
                    </Tp>
                </CdtrRefInf>
            </Strd>
        </RmtInf>
    </CdtTrfTxInf>
    <CdtTrfTxInf>
        <Cdtr>
            <Nm>US</Nm>
            <PstlAdr>
                <Ctry>DK</Ctry>
                <AdrLine>ABC</AdrLine>
            </PstlAdr>
        </Cdtr>
        <CdtrAcct>
            <Id>
                <Othr>
                    <Id>12345678</Id>
                    <SchmeNm>
                        <Cd>ABCD</Cd>
                    </SchmeNm>
                </Othr>
            </Id>
        </CdtrAcct>
        <RmtInf>
            <Strd>
                <CdtrRefInf>
                    <Tp>
                        <CdOrPrtry>
                            <Cd>USA</Cd>
                        </CdOrPrtry>
                    </Tp>
                </CdtrRefInf>
            </Strd>
        </RmtInf>
    </CdtTrfTxInf>
</PmtInf>

XSLT 1.0

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <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="CdtTrfTxInf[Cdtr/PstlAdr/Ctry='US' and RmtInf/Strd/CdtrRefInf/Tp/CdOrPrtry/Cd='UK']/CdtrAcct/Id/Othr/SchmeNm"/>

</xsl:stylesheet>

XML输出

<PmtInf>
   <CdtTrfTxInf>
      <Cdtr>
         <Nm>US</Nm>
         <PstlAdr>
            <Ctry>US</Ctry>
            <AdrLine>ABC</AdrLine>
         </PstlAdr>
      </Cdtr>
      <CdtrAcct>
         <Id>
            <Othr>
               <Id>12345678</Id>
            </Othr>
         </Id>
      </CdtrAcct>
      <RmtInf>
         <Strd>
            <CdtrRefInf>
               <Tp>
                  <CdOrPrtry>
                     <Cd>UK</Cd>
                  </CdOrPrtry>
               </Tp>
            </CdtrRefInf>
         </Strd>
      </RmtInf>
   </CdtTrfTxInf>
   <CdtTrfTxInf>
      <Cdtr>
         <Nm>US</Nm>
         <PstlAdr>
            <Ctry>DK</Ctry>
            <AdrLine>ABC</AdrLine>
         </PstlAdr>
      </Cdtr>
      <CdtrAcct>
         <Id>
            <Othr>
               <Id>12345678</Id>
               <SchmeNm>
                  <Cd>ABCD</Cd>
               </SchmeNm>
            </Othr>
         </Id>
      </CdtrAcct>
      <RmtInf>
         <Strd>
            <CdtrRefInf>
               <Tp>
                  <CdOrPrtry>
                     <Cd>USA</Cd>
                  </CdOrPrtry>
               </Tp>
            </CdtrRefInf>
         </Strd>
      </RmtInf>
   </CdtTrfTxInf>
</PmtInf>