2012-08-30 27 views
3

我是XSL的新手,並試圖查看這裏的所有示例,但沒有一個符合我的問題。XSL 1.0 - 從不同列表中排序列表

我有電影的排序順序列表(順序從左至右)

<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,然後添加分隔字符,然後使用子字符串 - 之前的技巧。結果是我的排序列表在其他電影之前確實顯示在最前面,但它不是正確的順序。請幫忙。

回答

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以上,從而生成電影F,電影G,電影C的順序。

它實際上使用每個之前出現的電影名稱列表中的部分作爲排序關鍵字;按字母順序排列,;movieF;出現在;movieF;movieC;之前,因此排序時它會將movieC置於movieG之上。

我個人傾向於避免使用逗號作爲分隔符,因爲它們可以用在某些名稱中,例如「臥虎藏龍」。分號的可能性要小得多,但只要不是出現在電影名稱中,就可以使用任何你喜歡的字符。