2012-08-02 116 views
1

請原諒我以前的類似帖子。希望我可以從很好的反饋中學習,但仍然在XPath中掙扎。我再次爲類似的帖子感到抱歉!xsl轉換 - 刪除重複

當前XML

<?xml version="1.0" encoding="utf-8" ?> 
<data> 
    <table_1 dropdown1="Item1"></table_1> 
    <listitems key1="Item1" name="" key2="Id2"/> 
    <listitems key1="Item1" name="Item A" key2="Id2"/> 
    <listitems key1="Item1" name="Item B" key2="Id2"/> 
    <listitems key1="Item1" name="" key2="Id4"/> 
    <listitems key1="Item1" name="Item A" key2="Id4"/> 
    <listitems key1="Item1" name="Item B" key2="Id4"/> 
    <listitems key1="Item2" name="" key2="Id6"/> 
    <listitems key1="Item2" name="Item C" key2="Id6"/> 
    <listitems key1="Item2" name="Item D" key2="Id6"/> 
</data> 

當前XSL

<xsl:template match="/"> 
    <html> 
     <head> 
      <title>Untitled</title> 
     </head> 
     <body> 
      <xsl:for-each select="/data/listitems[@key1=/data/table_1/@dropdown1]"> 
       <xsl:value-of select="@name"/>      
       <br/> 
      </xsl:for-each> 

     </body> 
    </html> 
</xsl:template> 

<xsl:template match="listitems"> 
    <xsl:value-of select="concat(@name, ' ')" /> 
</xsl:template> 

當前結果:

enter image description here

+0

棒,你沒有給我們一些非常重要的東西 - 請提供轉換的確切想要的結果。這可能有助於讀者瞭解需要哪些分組 - 除非您還指定了分組的要求。記住一個基本原則:不要讓讀者猜測實際需要什麼。請。 – 2012-08-03 01:53:47

+0

你是否應該讓你第一個6'listitem'元素全部用'key1 =「Item1」'?你的代碼不會重複任何事情,項目A和項目B都存在兩次,並且都具有相同的'key1'值。 – Flynn1179 2012-08-03 06:23:40

+0

@DimitreNovatchev我試圖獲得的唯一值將填充一個下拉列表。我使用名稱屬性值作爲下拉列表的項目。 – Rod 2012-08-03 13:05:42

回答

1

假設你考慮<listitems>元素具有相同name屬性爲重複,您可以使用XPath的preceding-sibling軸忽略是重複的所有元素:

<xsl:for-each select="/data/listitems[@key1=/data/table_1/@dropdown1][not(@name = preceding-sibling::listitems/@name)]"> 

這意味着,你選擇你所選擇的項目,附加限制是不存在任何先前的<listitems>兄弟元素,其name屬性具有與被測試的元素相同的值。

+0

我試着用你的每條線代替我,但我仍然得到重複。難道我做錯了什麼? – Rod 2012-08-02 21:06:09

+1

@rod:對不起,這太複雜了,包含一個錯字;我編輯了我的答案並測試了新版本;現在我跳過任何重複項。 – 2012-08-02 21:46:23

+0

非常感謝您的幫助 – Rod 2012-08-03 13:14:18