2009-06-20 50 views
1

如果系統發現重複,它應該完全消除這兩個節點。 我有原始的XML爲:如何使用XSLT刪除重複的節點?

<?xml version="1.0" encoding="utf-8"?> 
<RESPONSE> 
    <RECORD> 
    <COUNTRY_ID>2111</COUNTRY_ID> 
    <CITY id="2:">0</CITY> 
    <LOCATION id="1:14404388">LA11CFTXX</LOCATION> 
    <REPID id="1:">1</REPID> 
    <FLIGHTID id="1:1091513">ALK</FLIGHTID> 
    </RECORD> 
    <RECORD> 
    <COUNTRY_ID>2121</COUNTRY_ID> 
    <CITY id="2:">0</CITY> 
    <LOCATION id="1:14404388">LA11CFTXX</LOCATION> 
    <REPID id="2:">2</REPID> 
    <FLIGHTID id="1:1091513">ALK</FLIGHTID> 
    </RECORD> 
    <RECORD> 
    <COUNTRY_ID>2211</COUNTRY_ID> 
    <CITY id="2:">0</CITY> 
    <LOCATION id="2:14048042">LAZ1129YY</LOCATION> 
    <REPID id="1:">1</REPID> 
    <FLIGHTID id="1:1091513">ALK</FLIGHTID> 
    </RECORD> 
    <RECORD> 
    <COUNTRY_ID>2221</COUNTRY_ID> 
    <CITY id="2:">0</CITY> 
    <LOCATION id="2:14048042">LAZ1129YY</LOCATION> 
    <REPID id="2:">2</REPID> 
    <FLIGHTID id="1:1091513">ALK</FLIGHTID> 
    </RECORD> 
    <RECORD> 
    <COUNTRY_ID>3111</COUNTRY_ID> 
    <CITY id="3:">30</CITY> 
    <LOCATION id="1:14404388">LA11CFTXX</LOCATION> 
    <REPID id="1:">1</REPID> 
    <FLIGHTID id="1:1091513">ALK</FLIGHTID> 
    </RECORD> 
    <RECORD> 
    <COUNTRY_ID>3121</COUNTRY_ID> 
    <CITY id="3:">30</CITY> 
    <LOCATION id="1:14404388">LA11CFTXX</LOCATION> 
    <REPID id="2:">2</REPID> 
    <FLIGHTID id="1:1091513">ALK</FLIGHTID> 
    </RECORD> 
    <RECORD> 
    <COUNTRY_ID>3211</COUNTRY_ID> 
    <CITY id="3:">30</CITY> 
    <LOCATION id="2:14048042">LAZ1129YY</LOCATION> 
    <REPID id="1:">1</REPID> 
    <FLIGHTID id="1:1091513">ALK</FLIGHTID> 
    </RECORD> 
    <RECORD> 
    <COUNTRY_ID>3221</COUNTRY_ID> 
    <CITY id="3:">30</CITY> 
    <LOCATION id="2:14048042">LAZ1129YY</LOCATION> 
    <REPID id="2:">2</REPID> 
    <FLIGHTID id="1:1091513">ALK</FLIGHTID> 
    </RECORD> 
    <RECORD> 
    <COUNTRY_ID>2111</COUNTRY_ID> 
    <CITY id="2:">0</CITY> 
    <LOCATION id="1:14404388">LA11CFTXX</LOCATION> 
    <REPID id="1:">1</REPID> 
    <FLIGHTID id="1:1091513">ALK</FLIGHTID> 
    </RECORD> 
    <RECORD> 
    <COUNTRY_ID>2121</COUNTRY_ID> 
    <CITY id="2:">0</CITY> 
    <LOCATION id="1:14404388">LA11CFTXX</LOCATION> 
    <REPID id="2:">2</REPID> 
    <FLIGHTID id="1:1091513">ALK</FLIGHTID> 
    </RECORD> 
    <RECORD> 
    <COUNTRY_ID>2211</COUNTRY_ID> 
    <CITY id="2:">0</CITY> 
    <LOCATION id="2:14048042">LAZ1129YY</LOCATION> 
    <REPID id="1:">1</REPID> 
    <FLIGHTID id="1:1091513">ALK</FLIGHTID> 
    </RECORD> 
    <RECORD> 
    <COUNTRY_ID>2221</COUNTRY_ID> 
    <CITY id="2:">0</CITY> 
    <LOCATION id="2:14048042">LAZ1129YY</LOCATION> 
    <REPID id="2:">2</REPID> 
    <FLIGHTID id="1:1091513">ALK</FLIGHTID> 
    </RECORD> 
    <RECORD> 
    <COUNTRY_ID>2311</COUNTRY_ID> 
    <CITY id="2:">0</CITY> 
    <LOCATION id="3:14048629">LAZ11B91AA</LOCATION> 
    <REPID id="1:">1</REPID> 
    <FLIGHTID id="1:1091513">ALK</FLIGHTID> 
    </RECORD> 
    <RECORD> 
    <COUNTRY_ID>2321</COUNTRY_ID> 
    <CITY id="2:">0</CITY> 
    <LOCATION id="3:14048629">LAZ11B91AA</LOCATION> 
    <REPID id="2:">2</REPID> 
    <FLIGHTID id="1:1091513">ALK</FLIGHTID> 
    </RECORD> 
    <RECORD> 
    <COUNTRY_ID>3111</COUNTRY_ID> 
    <CITY id="3:">30</CITY> 
    <LOCATION id="1:14404388">LA11CFTXX</LOCATION> 
    <REPID id="1:">1</REPID> 
    <FLIGHTID id="1:1091513">ALK</FLIGHTID> 
    </RECORD> 
    <RECORD> 
    <COUNTRY_ID>3121</COUNTRY_ID> 
    <CITY id="3:">30</CITY> 
    <LOCATION id="1:14404388">LA11CFTXX</LOCATION> 
    <REPID id="2:">2</REPID> 
    <FLIGHTID id="1:1091513">ALK</FLIGHTID> 
    </RECORD> 
    <RECORD> 
    <COUNTRY_ID>3211</COUNTRY_ID> 
    <CITY id="3:">30</CITY> 
    <LOCATION id="2:14048042">LAZ1129YY</LOCATION> 
    <REPID id="1:">1</REPID> 
    <FLIGHTID id="1:1091513">ALK</FLIGHTID> 
    </RECORD> 
    <RECORD> 
    <COUNTRY_ID>3221</COUNTRY_ID> 
    <CITY id="3:">30</CITY> 
    <LOCATION id="2:14048042">LAZ1129YY</LOCATION> 
    <REPID id="2:">2</REPID> 
    <FLIGHTID id="1:1091513">ALK</FLIGHTID> 
    </RECORD> 
    <RECORD> 
    <COUNTRY_ID>3311</COUNTRY_ID> 
    <CITY id="3:">30</CITY> 
    <LOCATION id="3:14048629">LAZ11B91AA</LOCATION> 
    <REPID id="1:">1</REPID> 
    <FLIGHTID id="1:1091513">ALK</FLIGHTID> 
    </RECORD> 
    <RECORD> 
    <COUNTRY_ID>3321</COUNTRY_ID> 
    <CITY id="3:">30</CITY> 
    <LOCATION id="3:14048629">LAZ11B91AA</LOCATION> 
    <REPID id="2:">2</REPID> 
    <FLIGHTID id="1:1091513">ALK</FLIGHTID> 
    </RECORD> 
    <RECORD> 
    <COUNTRY_ID>4111</COUNTRY_ID> 
    <CITY id="4:">100</CITY> 
    <LOCATION id="1:14404388">LA11CFTXX</LOCATION> 
    <REPID id="1:">1</REPID> 
    <FLIGHTID id="1:1091513">ALK</FLIGHTID> 
    </RECORD> 
    <RECORD> 
    <COUNTRY_ID>4121</COUNTRY_ID> 
    <CITY id="4:">100</CITY> 
    <LOCATION id="1:14404388">LA11CFTXX</LOCATION> 
    <REPID id="2:">2</REPID> 
    <FLIGHTID id="1:1091513">ALK</FLIGHTID> 
    </RECORD> 
    <RECORD> 
    <COUNTRY_ID>4211</COUNTRY_ID> 
    <CITY id="4:">100</CITY> 
    <LOCATION id="2:14048042">LAZ1129YY</LOCATION> 
    <REPID id="1:">1</REPID> 
    <FLIGHTID id="1:1091513">ALK</FLIGHTID> 
    </RECORD> 
    <RECORD> 
    <COUNTRY_ID>4221</COUNTRY_ID> 
    <CITY id="4:">100</CITY> 
    <LOCATION id="2:14048042">LAZ1129YY</LOCATION> 
    <REPID id="2:">2</REPID> 
    <FLIGHTID id="1:1091513">ALK</FLIGHTID> 
    </RECORD> 
    <RECORD> 
    <COUNTRY_ID>4311</COUNTRY_ID> 
    <CITY id="4:">100</CITY> 
    <LOCATION id="3:14048629">LAZ11B91AA</LOCATION> 
    <REPID id="1:">1</REPID> 
    <FLIGHTID id="1:1091513">ALK</FLIGHTID> 
    </RECORD> 
    <RECORD> 
    <COUNTRY_ID>4321</COUNTRY_ID> 
    <CITY id="4:">100</CITY> 
    <LOCATION id="3:14048629">LAZ11B91AA</LOCATION> 
    <REPID id="2:">2</REPID> 
    <FLIGHTID id="1:1091513">ALK</FLIGHTID> 
    </RECORD> 
</RESPONSE> 

和所需的輸出應爲以下:

<?xml version="1.0" encoding="utf-8"?> 
<RESPONSE> 
<RECORD> 
    <COUNTRY_ID>2311</COUNTRY_ID> 
    <CITY id="2:">0</CITY> 
    <LOCATION id="3:14048629">LAZ11B91AA</LOCATION> 
    <REPID id="1:">1</REPID> 
    <FLIGHTID id="1:1091513">ALK</FLIGHTID> 
    </RECORD> 
<RECORD> 
    <COUNTRY_ID>2321</COUNTRY_ID> 
    <CITY id="2:">0</CITY> 
    <LOCATION id="3:14048629">LAZ11B91AA</LOCATION> 
    <REPID id="2:">2</REPID> 
    <FLIGHTID id="1:1091513">ALK</FLIGHTID> 
    </RECORD> 
<RECORD> 
    <COUNTRY_ID>3311</COUNTRY_ID> 
    <CITY id="3:">30</CITY> 
    <LOCATION id="3:14048629">LAZ11B91AA</LOCATION> 
    <REPID id="1:">1</REPID> 
    <FLIGHTID id="1:1091513">ALK</FLIGHTID> 
    </RECORD> 
    <RECORD> 
    <COUNTRY_ID>3321</COUNTRY_ID> 
    <CITY id="3:">30</CITY> 
    <LOCATION id="3:14048629">LAZ11B91AA</LOCATION> 
    <REPID id="2:">2</REPID> 
    <FLIGHTID id="1:1091513">ALK</FLIGHTID> 
    </RECORD> 
    <RECORD> 
    <COUNTRY_ID>4111</COUNTRY_ID> 
    <CITY id="4:">100</CITY> 
    <LOCATION id="1:14404388">LA11CFTXX</LOCATION> 
    <REPID id="1:">1</REPID> 
    <FLIGHTID id="1:1091513">ALK</FLIGHTID> 
    </RECORD> 
    <RECORD> 
    <COUNTRY_ID>4121</COUNTRY_ID> 
    <CITY id="4:">100</CITY> 
    <LOCATION id="1:14404388">LA11CFTXX</LOCATION> 
    <REPID id="2:">2</REPID> 
    <FLIGHTID id="1:1091513">ALK</FLIGHTID> 
    </RECORD> 
    <RECORD> 
    <COUNTRY_ID>4211</COUNTRY_ID> 
    <CITY id="4:">100</CITY> 
    <LOCATION id="2:14048042">LAZ1129YY</LOCATION> 
    <REPID id="1:">1</REPID> 
    <FLIGHTID id="1:1091513">ALK</FLIGHTID> 
    </RECORD> 
    <RECORD> 
    <COUNTRY_ID>4221</COUNTRY_ID> 
    <CITY id="4:">100</CITY> 
    <LOCATION id="2:14048042">LAZ1129YY</LOCATION> 
    <REPID id="2:">2</REPID> 
    <FLIGHTID id="1:1091513">ALK</FLIGHTID> 
    </RECORD> 
    <RECORD> 
    <COUNTRY_ID>4311</COUNTRY_ID> 
    <CITY id="4:">100</CITY> 
    <LOCATION id="3:14048629">LAZ11B91AA</LOCATION> 
    <REPID id="1:">1</REPID> 
    <FLIGHTID id="1:1091513">ALK</FLIGHTID> 
    </RECORD> 
    <RECORD> 
    <COUNTRY_ID>4321</COUNTRY_ID> 
    <CITY id="4:">100</CITY> 
    <LOCATION id="3:14048629">LAZ11B91AA</LOCATION> 
    <REPID id="2:">2</REPID> 
    <FLIGHTID id="1:1091513">ALK</FLIGHTID> 
    </RECORD> 
</RESPONSE> 

可我們能寫一個xsl做到這一點?

感謝

+0

你能定義複製?也許更簡潔的樣本會更好。 – 2009-06-20 23:37:11

回答

2

試試這個:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:template match="/"> 
    <xsl:apply-templates select="RESPONSE"/> 
    </xsl:template> 

    <xsl:template match="RESPONSE"> 
    <RESPONSE> 
     <xsl:apply-templates select="RECORD"/> 
    </RESPONSE> 
    </xsl:template> 

    <xsl:template match="RECORD"> 
    <xsl:variable name="this" select="."/> 
    <xsl:variable name="country" select="COUNTRY_ID/text()"/> 
    <xsl:if test="not(../RECORD[COUNTRY_ID/text() = $country and generate-id($this) != generate-id(.)])"> 
     <xsl:copy-of select="."/> 
    </xsl:if> 
    </xsl:template> 

</xsl:stylesheet> 

這一切都是假設,當你說「重複」你的意思是COUNTRY_ID具有相同的內容。我的XSLT似乎會生成您想要的輸出。

+0

謝謝你這正是我想要的。 – user114086 2009-06-21 02:09:03

1

這個選擇會給你一個有重複的COUNTRY_ID的集合。 (> 1)

select="/RESPONSE/RECORD/COUNTRY_ID/*[count(.|key('x',name())[1])>1]"> 

使用該設置,然後從您的選擇中排除這些。

我沒有運行測試,但它應該給你設置工作。