我有一个XML文件:
<schools>
<schcool>
school1, school2, school3, school4, school5
</schcool>
</schools>
我想编写XSLT(版本1.0)来将结果更改为相反的顺序:
<schools>
<schcool>
school5, school4, school3, school2, school1
</schcool>
</schools>
任何人都可以帮助我吗?非常感谢。
DY
答案 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