使用XSLT 1.0进行标记和排序

Pau*_*ers 5 sorting xslt tokenize xslt-1.0

我有一个分隔的字符串(在我下面的例子中用空格分隔),我需要对它进行标记,排序,然后重新连接在一起,我需要使用XSLT 1.0完成所有这些操作.我该怎么办?我知道我需要以xsl:sort某种方式使用,但到目前为止我所尝试的一切都给了我一些错误.

例如,如果我在此帖子的底部运行代码,我会得到:

草莓蓝莓橙色覆盆子石灰柠檬

如果我想要这样做,我该怎么办?:

蓝莓柠檬石灰橙色覆盆子草莓

请注意,我正在使用XSLT 1.0.

这是代码,它基于Jeni Tennison的代码.

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="tokenize1.xsl"?>
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
  <xsl:call-template name="tokenize">
    <xsl:with-param name="string" select="'strawberry blueberry orange raspberry lime lemon'" />
  </xsl:call-template>
</xsl:template>

<xsl:template name="tokenize">
  <xsl:param name="string" />
  <xsl:param name="delimiter" select="' '" />
  <xsl:choose>
    <xsl:when test="$delimiter and contains($string, $delimiter)">
      <token>
        <xsl:value-of select="substring-before($string, $delimiter)" />
      </token>
      <xsl:text> </xsl:text>
      <xsl:call-template name="tokenize">
        <xsl:with-param name="string" 
                        select="substring-after($string, $delimiter)" />
        <xsl:with-param name="delimiter" select="$delimiter" />
      </xsl:call-template>
    </xsl:when>
    <xsl:otherwise>
      <token><xsl:value-of select="$string" /></token>
      <xsl:text> </xsl:text>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)

ala*_*mar 0

如果你的处理器支持 EXSLT,你最好使用str:tokenize

\n\n

对于排序,为什么不使用 xsl:sort?

\n\n
<xsl:template match="/">\n  <xsl:variable name="tokens">\n  \xc2\xa0 <xsl:call-template name="tokenize">\n\xc2\xa0   \xc2\xa0 <xsl:with-param name="string" select="\'strawberry blueberry orange raspberry lime lemon\'" />\n  \xc2\xa0 </xsl:call-template>\n  </xsl:variable>\n\n  <xsl:for-each select="$tokens">\n    <xsl:sort select="text()" />\n    <xsl:value-of select="." />\n    <xsl:if test="not(last())">\n      <xsl:text> </xsl:text>\n    </xsl:if>\n  </xsl:for-each>\n</xsl:template>\n
Run Code Online (Sandbox Code Playgroud)\n\n

请注意,您可能需要 exsl:node-set 对迭代执行操作。

\n