3

我是 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 技巧。结果是我的排序列表确实在其余电影之前显示在顶部,但它的顺序不正确。请帮忙。

4

1 回答 1

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

我个人倾向于避免使用逗号作为分隔符,因为它们可以用于某些名称,例如“卧虎藏龙”。分号的可能性要小得多,但你可以使用任何你喜欢的角色,只要它不是出现在电影名称中的角色。

于 2012-08-30T22:26:11.647 回答