读取循环中的条目并使用XSL删除重复的条目

时间:2012-02-23 01:55:34

标签: xslt xslt-2.0 xslt-1.0

我是XSL的新手,我很困惑我们是否可以读取xml标记中的数据然后将其存储在数组或其他内容中,然后使用distinct选项删除副本。

例如

<local>
  <ID>
    <fruit>apple</fruit>
    <fruit>orange</fruit>
  </ID>
  <ID>
    <fruit>apple</fruit>
    <fruit>mango</fruit>
  </ID>
</local> 

在这里,我正在阅读Local作为循环启动器,需要读取它下面的所有ID并显示结果。在这种情况下,我不会有4种不同的水果,其中一种是重复的,所以我只想显示那些和显示的唯一条目。是否有可能使用XSLT完成此操作?

<xsl:for-each select="Local">  
  <xsl:variable name="fruits">
    <xsl:for-each select="set:distinct(ID/fruit)">
      <xsl:copy-of select="."/>
    </xsl:for-each>
  </xsl:variable>
</xsl:for-each>

1 个答案:

答案 0 :(得分:0)

<强>予。这个XSLT 1.0转换:

<xsl:stylesheet 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:key name="kFruitByName" match="fruit" use="."/>

 <xsl:template match="/">
   <xsl:copy-of select=
   "/*/*/fruit
     [generate-id()
     =
      generate-id(key('kFruitByName', .)[1])
     ]"/>
</xsl:template>
</xsl:stylesheet>

应用于提供的XML文档

<local>
    <ID>
        <fruit>apple</fruit>
        <fruit>orange</fruit>
    </ID>
    <ID>
        <fruit>apple</fruit>
        <fruit>mango</fruit>
    </ID>
</local>

生成想要的正确结果

<fruit>apple</fruit>
<fruit>orange</fruit>
<fruit>mango</fruit>

解释:使用 Muenchian method for grouping


<强> II。 XSLT 2.0解决方案:

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/*">
  <xsl:for-each-group select="*/fruit" group-by=".">
    <xsl:sequence select="."/>
  </xsl:for-each-group>
 </xsl:template>
</xsl:stylesheet>

将此转换应用于同一XML文档(上图)时,再次生成相同的正确结果

<fruit>apple</fruit>
<fruit>orange</fruit>
<fruit>mango</fruit>