我是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>
答案 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>