XSL 1.0 - 从不同的列表中对列表进行排序

时间:2012-08-30 05:28:27

标签: xslt xslt-1.0

我是XSL的新手,并试图查看这里的所有示例,但没有一个符合我的问题。

我有电影的排序顺序列表(从左到右排序)

<movies>movieF,movieC,movieG</movies>

现在我想把这个排序顺序列表排序在我的巨大电影列表之上

<moviesList>
 <movie>movieA</movie>
 <movie>movieB</movie>
 <movie>movieC</movie>
 <movie>movieD</movie>
 <movie>movieE</movie>
 <movie>movieF</movie>
 <movie>movieG</movie>
 <movie>movieH</movie>
</moviesList>

我想要的结果:

<moviesList>
 <movie>movieF</movie>
 <movie>movieC</movie>
 <movie>movieG</movie>
 <movie>movieA</movie>
 <movie>movieB</movie>
 <movie>movieD</movie>
 <movie>movieE</movie>
 <movie>movieH</movie>
</moviesList>
有人请给我一些指导如何实现这样的事情。我试图创建一个变量$ sortlist,然后添加分隔符,然后在排序上使用substring-before技巧。结果是我的排序列表确实显示在其余电影之前,但它没有正确的顺序。请帮忙。

1 个答案:

答案 0 :(得分:1)

试试这个:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:param name="sortlist" select="';movieF;movieC;movieG;'"/>

  <xsl:template match="moviesList">
    <xsl:copy>
      <xsl:for-each select="*[contains($sortlist, concat(';',.,';'))]">
        <xsl:sort select="substring-before($sortlist,concat(';',.,';'))" />
        <xsl:copy-of select="."/>
      </xsl:for-each>
      <xsl:copy-of select="*[not(contains($sortlist, concat(';',.,';')))]"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

注意,我没有使用string-length进行排序,我只是使用了字符串本身。 XSLT1.0可以按字母顺序排序,而不是数字排序,这可以将14放在7以上,从而产生订单movieF,movieG,movieC。

它实际上使用每个电影名称前面的电影名称部分作为排序键;按字母顺序,;movieF;出现在;movieF;movieC;之前,因此在排序时它会movieC放在movieG之上。

就我个人而言,我倾向于避免使用逗号作为分隔符,因为它们可以在某些名称中使用,例如“Crouching Tiger,Hidden Dragon”。分号的可能性要小得多,但你可以使用任何你喜欢的字符,只要它不是出现在电影名称中的字符。