2013-07-26 2 views
1

У меня был XML, немного похожий на то, что показано ниже. Мне нужно было найти уникальные категории. В XSLT 2.0 есть много простых способов. Но я должен был придерживаться 1,0 :(. После нескольких борьбы я нашел решение. Я думал делить. Может кому-то помочь. Пожалуйста, улучшите свой ответ. Я ценю.XSLT 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> 

решение. Я добавил в ответ раздел. Спасибо.

ответ

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 
Смежные вопросы