我是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技巧。结果是我的排序列表确实显示在其余电影之前,但它没有正确的顺序。请帮忙。
答案 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”。分号的可能性要小得多,但你可以使用任何你喜欢的字符,只要它不是出现在电影名称中的字符。