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 に答える