XSLT:用逗号反转字符串

时间:2009-12-17 10:43:56

标签: xslt

我有一个XML文件:

<schools>
    <schcool>
        school1, school2, school3, school4, school5
        </schcool>
    </schools>

我想编写XSLT(版本1.0)来将结果更改为相反的顺序:

   <schools>
    <schcool>
        school5, school4, school3, school2, school1
        </schcool>
    </schools>

任何人都可以帮助我吗?非常感谢。

DY

3 个答案:

答案 0 :(得分:4)

<template name="split" xmlns="http://www.w3.org/1999/XSL/Transform">
  <param name="s" />
  <param name="withcomma" select="false()" />
  <choose>
    <when test="contains($s, ',')">
      <!-- if there is still a comma, call me again
           with everything after the first comma... -->
      <call-template name="split">
        <with-param name="s" select="substring-after($s, ',')" />
        <with-param name="withcomma" select="true()" />
      </call-template>
      <!-- ...and print afterwards the current part -->
      <value-of select="substring-before($s, ',')" />
      <if test="$withcomma">
        <text>, </text>
      </if>
    </when>
    <otherwise>
      <!-- No comma left in the remaining part: print the rest -->
      <value-of select="$s" />
      <if test="$withcomma">
        <text>, </text>
      </if>
    </otherwise>
  </choose>
</template>

您可能不得不使用空格进行一些操作(查找XPath函数“normalize-space()”)以获得确切的结果,但原则上的反向排序显示在上面的代码中。从您的其他模板中调用它:

  <call-template name="split">
    <with-param name="s" select="." />
  </call-template>

答案 1 :(得分:1)

没有xsl的变体:选择:

  <xsl:template name="reverse">
    <xsl:param name="text"/>
    <xsl:param name="comma" select="false()"/>
    <xsl:variable name="item" select="substring-before(concat($text, ','), ',')"/>    
    <xsl:if test="normalize-space($item) != ''">
      <xsl:call-template name="reverse">
        <xsl:with-param name="text" select="substring-after(concat($text, ','), concat($item, ','))"/>
        <xsl:with-param name="comma" select="true()"/>
      </xsl:call-template>
    </xsl:if>
    <xsl:value-of select="$item"/>
    <xsl:if test="$comma and $item != ''">
      <xsl:text>,</xsl:text>
    </xsl:if>
  </xsl:template>

答案 2 :(得分:0)

谢谢。你节省了我的时间。

我删除了空格:

<xsl:call-template name="split">
     <xsl:with-param name="s" select="normalize-space(.)" />
</xsl:call-template>

非常感谢。

DY