存储到变量并使用XSL显示唯一条目

时间:2012-02-23 06:21:40

标签: xslt xslt-1.0

在那里,我想只显示其中的唯一水果条目。这是我用于解析的XML标记

<main>
<local id="1" type="Primary"> 
-<summary Date="23-02-12"> 
-<fruit>apple</fruit> 
-<fruit>Orange</fruit> 
</summary> 
</local> 
<local id="2" type="Primary"> 
-<summary Date="23-02-12"> 
-<fruit>apple</fruit> 
-<fruit>mango</fruit> 
</summary> 
</local> 
</main>

预期结果应采用以下格式

<fruit>apple</fruit>
<fruit>Orange</fruit>
<fruit>Mango</fruit>

以下是我正在尝试使用的代码段

<xsl:for-each select="main/local">  
<xsl:for-each select="symbol/fruit">
    <xsl:copy-of select="."/>
    <xsl:copy-of select="fruit[not(.=$fruit)]"/>
</xsl:for-each>
</xsl:for-each>

但我没有得到任何输出显示,你能帮我解决一下如何从这里删除这个重复冗余。提前谢谢

1 个答案:

答案 0 :(得分:0)

要在XSLT1.0中执行此操作,您可以使用称为“Meunchian”分组的技术。首先,根据值

定义一个“查找” fruit 元素的键
<xsl:key name="fruit" match="fruit" use="." />

然后,要获取唯一的水果名称,请匹配恰好是密钥中第一个水果元素的 fruit 元素(并检查两个节点是否与generate-id()方法相同使用)

<xsl:apply-templates 
    select="//fruit[generate-id() = generate-id(key('fruit', .)[1])]" />

这是完整的XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="xml" indent="yes"/>
   <xsl:key name="fruit" match="fruit" use="." />

   <xsl:template match="/">
      <xsl:apply-templates 
         select="//fruit[generate-id() = generate-id(key('fruit', .)[1])]" />
   </xsl:template>

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

当应用于您的示例XML时,输出以下内容:

<fruit>apple</fruit>
<fruit>Orange</fruit>
<fruit>mango</fruit>