在这里,我只想显示其中唯一的水果条目
<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="." />
然后,为了获得唯一的水果名称,您匹配恰好是密钥中第一个水果元素的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>