XSLT: перевернуть строку запятой - PullRequest
1 голос
/ 17 декабря 2009

У меня есть XML-файл:

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

Я хочу написать XSLT (версия 1.0), чтобы изменить результат в обратном порядке:

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

Кто-нибудь может мне помочь? Большое спасибо.

DY

Ответы [ 3 ]

4 голосов
/ 17 декабря 2009
<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 голос
/ 17 декабря 2009

вариант без 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>
0 голосов
/ 17 декабря 2009

Спасибо. Вы сэкономили мое время.

Я убираю пробел этим:

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

Большое спасибо.

DY

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...