XSLT1.0如何获取不同的值



我有一个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

相关内容

  • 没有找到相关文章

最新更新