我是XSLT的新手,所以如果我发布了一个简单的问题,请不要介意 我有一个XML文件,我想根据其他节点的值删除一些选定的重复节点 我在此链接上找到了部分解决方案:" Remove elements based on other element's value -- XSLT"
我将上述解决方案应用于我的XML,但它删除了所有标记而不管其值如何 我想删除所有相应的SchemeNm标签,以下标签具有以下值:
不应删除不符合上述条件的其他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>
答案 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>