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

Xslt 存储到变量中并使用XSL显示唯一的条目,xslt,xslt-1.0,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="Pr

在这种情况下,我只想显示其中唯一的水果条目。这是我用于解析的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>


但是我没有得到任何输出显示,你能帮助我如何从这里删除这个重复的冗余吗。?提前感谢您

要在XSLT1.0中实现这一点,您可以使用称为“Meunchian”分组的技术。首先,根据值定义一个键来“查找”水果元素

<xsl:key name="fruit" match="fruit" use="." />

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


这是完整的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>
苹果公司 橙色 芒果
您可能已经问了一个类似的问题,并得到了正确的答案。为什么你现在问的基本上是同一个问题?请阅读更多关于门钦族分组(按照第一个问题答案中的链接)和一般分组的信息。对您或任何人来说,稍微修改XML文档并再次询问本质上相同的问题对您或任何人都是不利的。您对XPath的理解也有问题。请问一些新的、特定的XPath问题,比如:“什么XPath表达式选择XML文档中的所有
fruit
元素?”
<fruit>apple</fruit>
<fruit>Orange</fruit>
<fruit>mango</fruit>