1

我有一个类似于下面显示的 XML。我必须找到独特的类别。XSLT 2.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>

解决方案。我已在答案部分添加。谢谢。

4

1 回答 1

0

解决方案

<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
于 2013-07-26T20:15:32.253 回答