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 では、数値ではなくアルファベット順に並べ替えることができます。これにより、7 の上に 14 が配置され、movieF、movieG、movieC の順序になります。

実際には、各映画名の前にある映画名のリストの部分をソート キーとして使用します。アルファベット順で の;movieF;前に来る;movieF;movieC;ため、ソート時にmovieC上に配置されます。movieG

個人的には、'Crouching Tiger, Hidden Dragon' などの一部の名前でカンマを使用できるため、セパレータとしてコンマを使用することを避ける傾向があります。セミコロンの可能性ははるかに低いですが、映画の名前に登場するものでない限り、好きな文字を使用できます.

于 2012-08-30T22:26:11.647 に答える