目次へ

4.3 xsl:choose を用いた条件付き処理

<xsl:choose>
  <!-- Content: (xsl:when+, xsl:otherwise?) -->
</xsl:choose> 
<xsl:when
  test = boolean-expression>
  <!-- Content: template -->
</xsl:when> 
<xsl:otherwise>
  <!-- Content: template -->
</xsl:otherwise> 

xsl:if 要素には、対応する xsl:else や xsl:else-if 要素はありませんので、そういった処理をしたい場合は xsl:choose 要素を使用します。xsl:choose 要素は、選択肢がいくつかある場合の選択処理を行います。この要素は、1つ以上の xsl:when 要素と、任意である xsl:otherwise 要素を含みます。

xsl:when 要素が持つ属性は、必須である test 属性 1つだけです。この属性は評価した結果が true か false のいずれかになる XPath 式を指定します。

xsl:choose 要素を処理する際には、各 xsl:when 要素を順番に評価し、結果が true となる xsl:when 要素のうち、最初の要素のテンプレートを適用します。評価結果が true となる xsl:when がない場合は、xsl:otherwise 要素のテンプレートを適用します。評価結果が true となる xsl:when 要素がなく、xsl:otherwise 要素が存在しない場合は、何も生成しません。

<xsl:template match="people/person">
  <xsl:for-each select="work">
    <xsl:choose>
      <xsl:when test="@year < 1990">before 90s: </xsl:when>
      <xsl:when test="@year >= 1990 and @year < 2000">90s: </xsl:when>
      <xsl:otherwise>21st century: </xsl:otherwise>
    </xsl:choose>
    <xsl:value-of select="."/>,
  </xsl:for-each>
</xsl:template>

上記のテンプレートを people.xml に適用すると以下の出力を得られます。

  before 90s: isn't anything,
    90s: loveless,
    
  before 90s: pretty hate machine,
    90s: broken,
    90s: the downward spiral,
    90s: the fragile,
    21st century: and all that could have been,

4.4 ソート

<xsl:sort
  select = string-expression
  lang = { nmtoken }
  data-type = { "text" | "number" | qname-but-not-ncname }
  order = { "ascending" | "descending" }
  case-order = { "upper-first" | "lower-first" } /> 

ソート順を指定するには、xsl:apply-templates 要素または xsl:for-each 要素の子に、xsl:sort 要素を追加します。xsl:sort 要素は、テンプレートを適用するコンテキストノードリストの処理順を、ドキュメント順からアルファベット順などの別の順番に変更します。ソートキーの指定は、1番目の xsl:sort 子要素には 1次ソートキーを指定し、2番目の xsl:sort 子要素には 2次ソートキーを指定するというように行います。xsl:sort 要素を xsl:for-each 要素内で使用する場合は、xsl:sort 要素を先頭に記述しなければいけません。

select 属性は任意属性であり、属性値にはソートするためのキーを指定します。デフォルトではカレントノードの値が設定されます。

data-type 属性は任意属性であり、属性値には "text" あるいは "number" 等を指定します。text を指定すると文字順で、number を指定すると数値順でソートが行われます。デフォルトは文字順です。

order 属性は任意属性であり、属性値には "ascending" (昇順) か "descending" (降順) のいずれかを指定します。デフォルトは昇順です。

case-order 属性は任意属性であり、大文字と小文字のどちらを先とするのかを指定するために、属性値として "upper-first" (大文字が先) か "lower-first" (小文字が先) かのいずれかを指定します。デフォルトはシステムの言語に依存します。

<xsl:template match="people/person">
  <xsl:for-each select="work">
    <xsl:sort select="." data-type="text" order="descending" />
    <xsl:value-of select="." />,
  </xsl:for-each>
</xsl:template>

上記のテンプレートを people.xml に適用すると以下の出力を得られます。

  loveless,
    isn't anything,
    
  the fragile,
    the downward spiral,
    pretty hate machine,
    broken,
    and all that could have been,

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp