2014-10-29 23 views
0
<category link-id="681" link-handle="package-products" value="Package products"> 
     <entry id="1077" images="1" products="1" brands="1"> 
      <sub-category> 
       <item handle="pens">Pens</item> 
       <item handle="refills-pens">Refills : Pens</item> 
      </sub-category> 
     </entry> 
     <entry id="1075" images="1" products="1" brands="1"> 
      <sub-category> 
       <item handle="pencil">Pencil</item> 
       <item handle="refills-pencil">Refills : Pencil</item> 
      </sub-category> 
     </entry> 
     <entry id="1073" images="1" products="1" brands="1"> 
      <sub-category> 
       <item handle="pencil">Pencil</item> 
       <item handle="refills-pencil">Refills : Pencil</item> 
      </sub-category> 
     </entry> 
     <entry id="1050" images="1" products="1" brands="1"> 
      <sub-category> 
       <item handle="marker">Marker</item> 
       <item handle="refills-marker">Refills : Marker</item> 
      </sub-category> 
     </entry> 

我想從子類別中刪除輸出的重複第3塊。 請幫助我。 我想輸出:從xml中刪除重複的子類別塊項目

Pens 

Refills : Pens 

Pencil 

Refills : Pencils 

Marker 

Refills : Marker 
+0

你可以張貼XSLT(你都試過),始終張貼測試的簡單和完整的XML(在這裏,它沒有良好的XML)。 – 2014-10-29 14:11:22

+1

什麼版本的XSLT? – 2014-10-29 15:12:42

+0

@DanielHaley:1.0版本的XSLT – 2014-10-30 05:00:32

回答

1

試試這個:(XSLT第2版)

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:key name="kItemHandle" match="entry" use="sub-category/item"/> 

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

<xsl:template match="category"> 
    <xsl:for-each select="entry[count(. | key('kItemHandle', sub-category/item[1])[1])=1]"> 
     <xsl:value-of select="sub-category/item[1]"/> 
     <xsl:text>&#xa;</xsl:text> 
     <xsl:value-of select="sub-category/item[2]"/><xsl:text>&#xa;</xsl:text> 
    </xsl:for-each> 
</xsl:template> 

</xsl:stylesheet> 
+0

非常感謝幫助!現在我有問題是爲什麼和這個聲明的用途是什麼「 」也我有多個類別意味着超過3他們重複也是如此,你可以建議如何使它動態抱歉提出這樣的問題,但我真的XSLT新手。 – 2014-10-30 07:14:33

+0

適用於NEWLINE字符(換行符)。對於多種catogories,你可以先嚐試一下,現在「入門」是多種權利,就像更改「CATOGORY」一樣。我會很快建議。如果可能,提出一個新問題。 – 2014-10-30 09:25:45

2

下面是一個使用XSLT 2.0的分組(xsl:for-each-group)的選項。 Rudramuni TP提出的選項實際上可以用作XSLT 1.0選項。

XML輸入

<category link-id="681" link-handle="package-products" value="Package products"> 
    <entry id="1077" images="1" products="1" brands="1"> 
     <sub-category> 
      <item handle="pens">Pens</item> 
      <item handle="refills-pens">Refills : Pens</item> 
     </sub-category> 
    </entry> 
    <entry id="1075" images="1" products="1" brands="1"> 
     <sub-category> 
      <item handle="pencil">Pencil</item> 
      <item handle="refills-pencil">Refills : Pencil</item> 
     </sub-category> 
    </entry> 
    <entry id="1073" images="1" products="1" brands="1"> 
     <sub-category> 
      <item handle="pencil">Pencil</item> 
      <item handle="refills-pencil">Refills : Pencil</item> 
     </sub-category> 
    </entry> 
    <entry id="1050" images="1" products="1" brands="1"> 
     <sub-category> 
      <item handle="marker">Marker</item> 
      <item handle="refills-marker">Refills : Marker</item> 
     </sub-category> 
    </entry> 
</category> 

XSLT 2.0

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="/*"> 
     <xsl:for-each-group select="entry/sub-category" group-by="item[1]"> 
      <xsl:apply-templates select="current-group()[1]"/>     
     </xsl:for-each-group> 
    </xsl:template> 

    <xsl:template match="item"> 
     <xsl:value-of select="concat(.,'&#xA;&#xA;')"/> 
    </xsl:template> 

</xsl:stylesheet> 

輸出

Pens 

Refills : Pens 

Pencil 

Refills : Pencil 

Marker 

Refills : Marker 
+0

+1,非常簡單和完美的代碼。 – 2014-10-29 16:20:18

0

這對於多 'catogory':

輸入XML:

<root> 
<category link-id="681" link-handle="package-products" value="Package products"> 
    <entry id="1077" images="1" products="1" brands="1"> 
     <sub-category> 
      <item handle="pens">Pens</item> 
      <item handle="refills-pens">Refills : Pens</item> 
     </sub-category> 
    </entry> 
    <entry id="1075" images="1" products="1" brands="1"> 
     <sub-category> 
      <item handle="pencil">Pencil</item> 
      <item handle="refills-pencil">Refills : Pencil</item> 
     </sub-category> 
    </entry> 
    <entry id="1073" images="1" products="1" brands="1"> 
     <sub-category> 
      <item handle="pencil">Pencil</item> 
      <item handle="refills-pencil">Refills : Pencil</item> 
     </sub-category> 
    </entry> 
    <entry id="1050" images="1" products="1" brands="1"> 
     <sub-category> 
      <item handle="marker">Marker</item> 
      <item handle="refills-marker">Refills : Marker</item> 
     </sub-category> 
    </entry> 
</category> 

<category link-id="681" link-handle="package-products" value="Package products"> 
    <entry id="1077" images="1" products="1" brands="1"> 
     <sub-category> 
      <item handle="pens">Pens</item> 
      <item handle="refills-pens">Refills : Pens</item> 
     </sub-category> 
    </entry> 
    <entry id="1075" images="1" products="1" brands="1"> 
     <sub-category> 
      <item handle="pencil">Pencil</item> 
      <item handle="refills-pencil">Refills : Pencil</item> 
     </sub-category> 
    </entry> 
    <entry id="1073" images="1" products="1" brands="1"> 
     <sub-category> 
      <item handle="pencil">Pencil</item> 
      <item handle="refills-pencil">Refills : Pencil</item> 
     </sub-category> 
    </entry> 
    <entry id="1050" images="1" products="1" brands="1"> 
     <sub-category> 
      <item handle="marker">Marker</item> 
      <item handle="refills-marker">Refills : Marker</item> 
     </sub-category> 
    </entry> 
    <entry id="1052" images="1" products="1" brands="1"> 
     <sub-category> 
      <item handle="paper">Paper</item> 
      <item handle="refills-paper">Refills : Paper</item> 
     </sub-category> 
    </entry> 
</category> 
</root> 

XSLT:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:key name="kItemHandle" match="entry" use="sub-category/item"/> 

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

<xsl:template match="root"> 
    <xsl:for-each select="category/entry[count(. | key('kItemHandle', sub-category/item)[1])=1]"> 
     <xsl:value-of select="sub-category/item[1]"/> 
     <xsl:text>&#xa;</xsl:text> 
     <xsl:value-of select="sub-category/item[2]"/><xsl:text>&#xa;</xsl:text> 
    </xsl:for-each> 
</xsl:template> 
</xsl:stylesheet> 

輸出:


筆芯:鋼筆
鉛筆
筆芯:鉛筆
標記
筆芯:標記

筆芯:紙