xslt删除重复和原始元素

时间:2014-08-04 15:28:15

标签: xml xslt

我有以下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>

1 个答案:

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