我有以下XML并希望删除“TxnId”和“OrigTxnId”相同的两条记录。
<XML>
<Record><GroupId>10028</GroupId><SessionId>264-10028-1-515530-2</SessionId><TxnId>264-10028-1-515539-1</TxnId><Date>31-Jul-2014</Date><Time>11:22:40</Time><Account>1111111111</Account><NAD>5000</NAD></Record>
<Record><GroupId>10028</GroupId><SessionId>264-10028-1-515530-2</SessionId><TxnId>264-10028-1-515539-2</TxnId><Date>31-Jul-2014</Date><Time>11:22:40</Time><Account>2222222222</Account><NAD>6000</NAD></Record>
<Record><GroupId>10028</GroupId><SessionId>264-10028-1-515545-1</SessionId><TxnId>264-10028-1-515545-2</TxnId><Date>31-Jul-2014</Date><Time>11:22:55</Time><Account>3333333333</Account><NAD>1000</NAD></Record>
<Record><GroupId>10028</GroupId><TxnId>264-10028-1-515550-1</TxnId><Date>31-Jul-2014</Date><Time>11:23:32</Time><OrigTxnId>264-10028-1-515545-2</OrigTxnId><Account>3333333333</Account><NAD>1000</NAD></Record>
</XML>
这是我当前的XSL,但它仍然提供原始记录。
<xsl:transform version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="Record">
<xsl:copy-of select="."/>
</xsl:template>
<xsl:template match="/XML">
<XML>
<xsl:apply-templates select="Record[not(TxnId=preceding-sibling::Record/OrigTxnId or OrigTxnId=preceding-sibling::Record/TxnId and Account=preceding-sibling::Record/Account)]"/>
</XML>
</xsl:template>
</xsl:transform>
答案 0 :(得分:1)
怎么样:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="original" match="Record" use="TxnId" />
<xsl:key name="copy" match="Record" use="OrigTxnId" />
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Record[key('original', OrigTxnId) or key('copy', TxnId)]"/>
</xsl:stylesheet>