2012-04-17 27 views
0

如果我有這樣的XML文件中的XML是相同的:刪除刪除節點的地方是相似的不完全使用XSLT

<root> 
     <node id="a"> 
      <section id="a_1"> 
       <item id="0"> 
        <attribute> 
         <color>Red</color> 
        </attribute> 
       </item> 
      </section> 

      <section id="a_2"> 
       <item id="0"> 
        <attribute> 
         <color>Red</color> 
        </attribute> 
       </item> 
      </section>    
     </node> 

     <node id="b"> 
      <section id="b_1"> 

       <user id="b_1a"> 
        <attribute> 
         <name>John</name> 
        </attribute> 
       </user> 

       <user id="b_1b"> 
        <attribute>a</attribute> 
       </user> 

      </section> 

      <section id="b_1" method="create"> 

       <user id="b_1a"> 
        <attribute> 
         <name>John</name> 
        </attribute> 
       </user> 

       <user id="b_1c"> 
        <attribute>a</attribute> 
       </user> 

      </section> 

      <section id="b_2">     
       <user id="b_1a"> 
        <attribute> 
         <name>John</name> 
        </attribute> 
       </user> 

      </section> 
     </node> 
</root> 

,我想輸出是這樣的:

<root> 
     <node id="a"> 
      <section id="a_1"> 
       <item id="0"> 
        <attribute> 
         <color>Red</color> 
        </attribute> 
       </item> 
      </section> 

      <section id="a_2"> 
       <item id="0"> 
        <attribute> 
         <color>Red</color> 
        </attribute> 
       </item> 
      </section>    
     </node> 

     <node id="b"> 
      <section id="b_1"> 

       <user id="b_1a"> 
        <attribute> 
         <name>John</name> 
        </attribute> 
       </user> 

       <user id="b_1b"> 
        <attribute>a</attribute> 
       </user> 

      </section> 

      <section id="b_1" method="create"> 

       <user id="b_1c"> 
        <attribute>a</attribute> 
       </user> 

      </section> 

      <section id="b_2">     
       <user id="b_1a"> 
        <attribute> 
         <name>John</name> 
        </attribute> 
       </user> 

      </section> 
     </node> 
</root> 

正如我們可以看到,只要id是相同的,它將被視爲一個部分ID,即使它有其他方法。因此,我們在第二部分ID(b_1)中刪除具有「方法創建」的用戶標識(b_1a)。 這真的讓我感到沮喪,我一直無法忽略該方法。 所以任何幫助將不勝感激。 如果我們看看部分ID b_2,它也有相同的用戶ID b_1和相同的'約翰',但我們不刪除它,因爲它在不同的部分ID。 所以基本上我們會根據部分ID進行比較。

PS:元素可以是任何不總是用戶或節,但只要id是相同的。

非常感謝。

親切的問候, 約翰

+0

是的,我正在使用但它可以只消除不基於部分ID的相同用戶標識 – John 2012-04-17 04:20:26

+0

您的預期XML是否正確,因爲它包含兩個**用戶**元素,它們的ID均爲** b_1a **?你在你的問題中建議他們是重複的,即使他們有額外的'屬性' – 2012-04-17 06:31:38

+0

對不起,我修改了它的問題使其更清晰。重點是所有內容都將根據部分ID進行查看。如果section id是相同的(不管它是否有方法),我們查看該section id的子節點,並查看是否存在重複屬性,如果存在我們刪除第二節id(使用方法)中的用戶標識。希望這會消除混淆。乾杯。 – John 2012-04-17 07:37:09

回答

1

雖然我不是在要求完全清楚,我想你可能要組元素通過ID和含部分ID。這意味着你可以使用一個XSL:關鍵來查找元素

<xsl:key 
    name="lookup" 
    match="section//*[@id]" use="concat(ancestor::section[1]/@id, '|', @id)" /> 

在這裏,我們查找元素根據他們的部分ID和自己的ID(任何元素)。然後,它只是在查找中存在具有匹配的id的另一個元素的部分中忽略元素的情況。

<xsl:template 
    match="section//*[@id] 
    [generate-id() 
    != generate-id(key('lookup', concat(ancestor::section[1]/@id, '|', @id))[1])]" /> 

(這實際上是說,是該元素在查找第一個元素。如果沒有,忽略它)

以下是完整的XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:key name="lookup" match="section//*[@id]" use="concat(ancestor::section[1]/@id, '|', @id)" /> 

    <xsl:template match="@*|node()"> 
     <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="section//*[@id][generate-id() != generate-id(key('lookup', concat(ancestor::section[1]/@id, '|', @id))[1])]" /> 
</xsl:stylesheet> 

當應用於您的示例XML,以下是輸出

<root> 
    <node id="a"> 
     <section id="a_1"> 
     <item id="0"> 
      <attribute> 
       <color>Red</color> 
      </attribute> 
     </item> 
     </section> 
     <section id="a_2"> 
     <item id="0"> 
      <attribute> 
       <color>Red</color> 
      </attribute> 
     </item> 
     </section> 
    </node> 
    <node id="b"> 
     <section id="b_1"> 
     <user id="b_1a"> 
      <attribute> 
       <name>John</name> 
      </attribute> 
     </user> 
     <user id="b_1b"> 
      <attribute>a</attribute> 
     </user> 
     </section> 
     <section id="b_1" method="create"> 
     <user id="b_1c"> 
      <attribute>a</attribute> 
     </user> 
     </section> 
     <section id="b_2"> 
     <user id="b_1a"> 
      <attribute> 
       <name>John</name> 
      </attribute> 
     </user> 
     </section> 
    </node> 
</root> 
+0

它就像一個魅力!非常感謝。..你有什麼好的參考,我可以學習更多關於xsl:key嗎? – John 2012-04-17 08:18:23

+0

嘗試http://www.devguru.com/technologies/xslt/quickref/xslt_element_key.html或http://www.jenitennison.com/xslt/grouping/muenchian.html – 2012-04-17 09:51:34