我有一个XML,与下面显示的内容有些相似。我必须找到独特的类别。XSLT2.0中有很多简单的方法。但我不得不坚持1.0:(。经过几次努力,我找到了解决方案。我想分享。可能会帮助别人。请改进我的答案。我很感激。
<root>
<category>
this is Games category
</category>
<category>
this is Books category
</category>
<category>
this is Food category
</category>
<category>
this is Games category
</category>
<category>
this is Books category
</category>
<category>
this is Food category
</category>
<category>
this is Travel category
</category>
<category>
this is Travel category
</category>
</root>
解决方案。我在回答部分补充了这一点。谢谢
解决方案
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:variable name="test">
<xsl:call-template name="delimitedvalues">
<xsl:with-param name="paramvalues" select="//category" />
</xsl:call-template>
</xsl:variable>
<xsl:call-template name="distinctvalues">
<xsl:with-param name="values" select="$test" />
</xsl:call-template>
</xsl:template>
<xsl:template name="distinctvalues">
<xsl:param name="values"/>
<xsl:variable name="firstvalue" select="substring-before($values, ',')"/>
<xsl:variable name="restofvalue" select="substring-after($values, ',')"/>
<xsl:if test="contains($values, ',') = false">
<xsl:value-of select="$values"/>
</xsl:if>
<xsl:if test="contains($restofvalue, $firstvalue) = false">
<xsl:value-of select="$firstvalue"/>
<xsl:text>,</xsl:text>
</xsl:if>
<xsl:if test="$restofvalue != ''">
<xsl:call-template name="distinctvalues">
<xsl:with-param name="values" select="$restofvalue" />
</xsl:call-template>
</xsl:if>
</xsl:template>
<xsl:template name="delimitedvalues">
<xsl:param name="paramvalues" />
<xsl:value-of select="substring-before(substring-after($paramvalues,'this is '),' category')"/>
<xsl:if test="$paramvalues/following::category">
<xsl:text>,</xsl:text>
<xsl:call-template name="delimitedvalues">
<xsl:with-param name="paramvalues" select="$paramvalues/following::category" />
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
输出
Games,Books,Food,Travel
源代码
http://www.xsltcake.com/slices/0iWpyI