1

XSL で自然な大文字と小文字の並べ替えを行うことは可能で、どのように達成するのでしょうか?

たとえば、次の XML スニペットがあるとします。

<items>
  <item>A 24</item>
  <item>B 12</item>
  <item>B 11</item>
  <item>C 10</item>
  <item>A 1</item>
  <item>B 2</item>
</item>

以下のような要素のリストが得られるように、出力を並べ替えるにはどうすればよいですか?

<ul>
  <li>A 1</li>
  <li>A 24</li>
  <li>B 2</li>
  <li>B 11</li>
  <li>B 12</li>
  <li>C 10</li>
</ul>

編集:私は、任意の文字列を操作できるソリューションに特に興味があります。PHP のnatsortが機能する方法と同様に、一般的なパターンに従わないもの。

4

1 に答える 1

0

複数xsl:sortのを使用できます。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="/items">
    <ul>
      <xsl:apply-templates select="item">
        <xsl:sort select="substring-before(., ' ')" />
        <xsl:sort select="substring-after(., ' ')" data-type="number" />
      </xsl:apply-templates>
    </ul>
  </xsl:template>

  <xsl:template match="item">
    <li>
      <xsl:value-of select="."/>
    </li>
  </xsl:template>
</xsl:stylesheet>

サンプル入力で実行すると、次が生成されます。

<ul>
  <li>A 1</li>
  <li>A 24</li>
  <li>B 2</li>
  <li>B 11</li>
  <li>B 12</li>
  <li>C 10</li>
</ul>

より完全な (一般的な) 自然な並べ替えには、より複雑なアプローチが必要です。Dimitre Novatchev はここ Stack Overflow でXSLT 1.0 アプローチを提供しており、別のサイトではXSLT 2.0 アプローチを採用しているようです。どちらもここで複製するには長すぎるので、それらのリンクで探してください。

于 2013-02-05T15:39:08.730 に答える