<xsl:number>  
対象項目をカウントします。通常、この要素はドキュメントの部分をカウントするために使用されますが、数値の書式を設定するためにも使用できます。
 
カテゴリ

命令

 
必須の属性

なし。

 
省略可能な属性
count
count 属性は、カウントする対象を定義する XPath 式です。

level
この属性により、要素をカウントするときに考慮するソースツリーのレベルを定義します。この属性に有効な値は、 single multiple 、および any の 3 つです。

single
1 つのレベルでのみ項目をカウントします。XSLT プロセッサは count 属性に一致する ancestor-or-self 軸の最初のノードに移動し、そのノードと count 属性に一致する前のすべての兄弟をカウントします。

multiple
複数のレベルで項目をカウントします。XSLT プロセッサは現在のノードのすべての先祖と現在のノード自体を対象とし、 count 属性に一致するすべてのノードを選択します。

any
現在のノードのすべての先祖 ( level= " multiple " と同様) と preceding 軸のすべての要素を含めます。

これらいずれの場合でも、 from 属性が使用されると、調べられる先祖は from 属性に一致する直近の先祖の子孫のみです。つまり、 from= " h1 " を使用した場合、カウントの対象となるノードは直近の < h1 > 属性以下にあるノードのみです。

from
from 属性は、カウントを開始する場所を定義する XPath 式です。たとえば、 from 属性を使用して、前の < h1 > 要素でカウントを開始するように指定できます。

value
数に変換される式。この属性を使用すると、簡単に数の書式を設定できます。要素 < xsl:number value= " 7 " format= " i: " / > は文字列 "vii:" を返します。

format
format 属性により、生成された数の書式を定義します。

format= " 1 "
一連の数の書式を 1 2 3 4 5 6 7 8 9 10 11 ... と設定します。

format= " 01 "
一連の数の書式を 01 02 03 04 ... 09 10 11 ... 99 100 101 ... と設定します。

format= " a "
一連の数の書式を a b c d e f ... x y z aa ab ac ... と設定します。

format= " A "
一連の数の書式を A B C D E F ... X Y Z AA AB AC ... と設定します。

format= " i "
一連の数の書式を i ii iii iv v vi vii viii ix x ... と設定します。

format= " I "
一連の数の書式を I II III IV V VI VII VIII IX X ... と設定します。

format= " anything else "
この動作は、使用している XSLT プロセッサによって異なります。XSLT の仕様では、他の番号付け方法 (タイ数字、カタカナでの番号付け、伝統的なヘブライ語での番号付けなど) が示されます。サポートされている書式については、使用している XSLT プロセッサのマニュアルを参照してください。要求した番号付け方法が XSLT プロセッサでサポートされていない場合は、XSLT の仕様では format= " 1 " を初期設定値として使用する必要があります。

lang
lang 属性により、アルファベットを使用する言語を定義します。サポートされている言語の値は XSLT プロセッサによって異なります。詳細については、使用する XSLT プロセッサのマニュアルを参照してください。

letter-value
この属性の値は、 alphabetic または traditional です。多くの言語では、2 つの文字ベースの番号付け方法を使用しています。数値をアルファベット順に割り当てる方法と、言語固有の数字を使用する方法です。この例として、アルファベット順を使用しないローマ数字の文字ベースの番号付け方法があります。この属性の初期設定値は alphabetic です。

grouping-separator
この属性は、生成される数字の桁を区切るために使用する文字です。初期設定値はコンマ ( , ) です。

grouping-size
この属性により、各グループの桁数を定義します。初期設定値は 3 です。

 
コンテンツ

なし。<xsl:number> は空の要素です。

 
指定先

<xsl:number> はテンプレート内に表示されます。

 
定義先

XSLT 7.7 節「番号付け」

 

<xsl:number> の動作を詳しく説明するには、カウントする対象がたくさん含まれる XML ドキュメントが必要です。ここでは、次のドキュメントを使用します。

<?xml version="1.0"?>
<book>
  <chapter>
    <title>Alfa Romeo</title>
    <sect1>
      <title>Bentley</title>
    </sect1>
    <sect1>
      <title>Chevrolet</title>
      <sect2>
        <title>Dodge</title>
        <sect3>
          <title>Eagle</title>
        </sect3>
      </sect2>
    </sect1>
  </chapter>
  <chapter>
    <title>Ford</title>
    <sect1>
      <title>GMC</title>
      <sect2>
        <title>Honda</title>
        <sect3>
          <title>Isuzu</title>
        </sect3>
        <sect3>
          <title>Javelin</title>
        </sect3>
        <sect3>
          <title>K-Car</title>
        </sect3>
        <sect3>
          <title>Lincoln</title>
        </sect3>
      </sect2>
      <sect2>
        <title>Mercedes</title>
      </sect2>
      <sect2>
        <title>Nash</title>
        <sect3>
          <title>Opel</title>
        </sect3>
        <sect3>
          <title>Pontiac</title>
        </sect3>
      </sect2>
      <sect2>
        <title>Quantum</title>
        <sect3>
          <title>Rambler</title>
        </sect3>
        <sect3>
          <title>Studebaker</title>
        </sect3>
      </sect2>
    </sect1>
    <sect1>
      <title>Toyota</title>
      <sect2>
        <title>Um, is there a car that starts with "U"?</title>
      </sect2>
    </sect1>
    <sect1>
      <title>Volkswagen</title>
    </sect1>
  </chapter>
</book>

<xsl:number> を複数の方法で使用して、番号付けのさまざまなオプションを示します。スタイルシートと結果を参照し、これらについて説明します。スタイルシートは次のとおりです。

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

  <xsl:output method="text"/>

  <xsl:variable name="newline">
<xsl:text>
</xsl:text>
  </xsl:variable>

  <xsl:template match="/">
    <xsl:value-of select="$newline"/>
    <xsl:apply-templates select="book" mode="number-1"/>
    <xsl:apply-templates select="book" mode="number-2"/>
    <xsl:apply-templates select="book" mode="number-3"/>
    <xsl:apply-templates select="book" mode="number-4"/>
    <xsl:apply-templates select="book" mode="number-5"/>
    <xsl:apply-templates select="book" mode="number-6"/>

    <xsl:apply-templates select="book" mode="number-7"/>
  </xsl:template>

  <xsl:template match="book" mode="number-1">
    <xsl:text>Test #1: level="multiple", 
         count="chapter|sect1|sect2|sect3", 
         format="1.1.1.1. "</xsl:text>
    <xsl:value-of select="$newline"/>
    <xsl:value-of select="$newline"/>
    <xsl:for-each select="chapter|.//sect1|.//sect2|.//sect3">
      <xsl:number level="multiple" count="chapter|sect1|sect2|sect3"
        format="1.1.1.1. "/>
        <xsl:value-of select="title"/>
        <xsl:value-of select="$newline"/>
    </xsl:for-each>
    <xsl:value-of select="$newline"/>
  </xsl:template>

  <xsl:template match="book" mode="number-2">
    <xsl:text>Test #2: level="any", 
         count="chapter|sect1|sect2|sect3", 
         format="1. "</xsl:text>
    <xsl:value-of select="$newline"/>
    <xsl:value-of select="$newline"/>
    <xsl:for-each select="chapter|.//sect1|.//sect2|.//sect3">
      <xsl:number level="any" count="chapter|sect1|sect2|sect3"
        format="1. "/>
        <xsl:value-of select="title"/>
        <xsl:value-of select="$newline"/>
    </xsl:for-each>
    <xsl:value-of select="$newline"/>
  </xsl:template>

  <xsl:template match="book" mode="number-3">
    <xsl:text>Test #3: level="single", 
         count="chapter|sect1|sect2|sect3", 
         format="1.1.1.1. "</xsl:text>
    <xsl:value-of select="$newline"/>
    <xsl:value-of select="$newline"/>
    <xsl:for-each select="chapter|.//sect1|.//sect2|.//sect3">
      <xsl:number level="single" count="chapter|sect1|sect2|sect3"
        format="1.1.1.1. "/>
        <xsl:value-of select="title"/>
        <xsl:value-of select="$newline"/>
    </xsl:for-each>
    <xsl:value-of select="$newline"/>
  </xsl:template>


  <xsl:template match="book" mode="number-4">
    <xsl:text>Test #4: level="multiple", 
         select=".//sect2",
         count="chapter|sect1|sect2", 
         format="I-A-i: "</xsl:text>
    <xsl:value-of select="$newline"/>
    <xsl:value-of select="$newline"/>
    <xsl:for-each select=".//sect2">
      <xsl:number level="multiple" count="chapter|sect1|sect2"
        format="I-A-i: "/>
        <xsl:value-of select="title"/>
        <xsl:value-of select="$newline"/>
    </xsl:for-each>
    <xsl:value-of select="$newline"/>
  </xsl:template>

  <xsl:template match="book" mode="number-5">
    <xsl:text>Test #5: level="any", 
         count="[various elements]"
         from="[various elements]"
         format="1.1.1.1. "</xsl:text>
    <xsl:value-of select="$newline"/>
    <xsl:value-of select="$newline"/>
    <xsl:for-each select=".//sect3">
      <xsl:number level="any" from="book" count="chapter" format="1."/>
      <xsl:number level="any" from="chapter" count="sect1" format="1."/>
      <xsl:number level="any" from="sect1" count="sect2" format="1."/>
      <xsl:number level="any" from="sect2" count="sect3" format="1. "/>
      <xsl:value-of select="title"/>
      <xsl:value-of select="$newline"/>
    </xsl:for-each>
    <xsl:value-of select="$newline"/>
  </xsl:template>

  <xsl:template match="book" mode="number-6">
    <xsl:text>Test #6: level="any", 
         count="chapter|sect1|sect2|sect3",
         grouping-separator=",",
         using a variable to start counting at 1000.</xsl:text> 
    <xsl:value-of select="$newline"/>
    <xsl:value-of select="$newline"/>
    <xsl:for-each select="chapter|.//sect1|.//sect2|.//sect3">
      <xsl:variable name="value1">
        <xsl:number level="any" count="chapter|sect1|sect2|sect3"/>
      </xsl:variable>
      <xsl:number value="$value1 + 999"
        grouping-separator="." grouping-size="3"/>
      <xsl:text>. </xsl:text>
      <xsl:value-of select="title"/>
      <xsl:value-of select="$newline"/>
    </xsl:for-each>
    <xsl:value-of select="$newline"/>
  </xsl:template>

  <xsl:template match="book" mode="number-7">
    <xsl:text>Test #7: level="multiple", 
         count="chapter|sect1|sect2|sect3", 
         format="1.1.1.1. ",
         selecting up to the first two <sect1> elements from chapter 2.</xsl:text>
    <xsl:value-of select="$newline"/>
    <xsl:value-of select="$newline"/>
    <xsl:for-each select="chapter[2]/sect1[position() < 3]">
      <xsl:for-each select="chapter|.//sect1|.//sect2|.//sect3">
        <xsl:number level="multiple" count="chapter|sect1|sect2|sect3"
          format="1.1.1.1. "/>
        <xsl:value-of select="title"/>
        <xsl:value-of select="$newline"/>
      </xsl:for-each>
    </xsl:for-each>
  </xsl:template>

</xsl:stylesheet>

結果は次のとおりです。


Test #1: level="multiple", 
         count="chapter|sect1|sect2|sect3", 
         format="1.1.1.1. "

1. Alfa Romeo
1.1. Bentley
1.2. Chevrolet
1.2.1. Dodge
1.2.1.1. Eagle
2. Ford
2.1. GMC
2.1.1. Honda
2.1.1.1. Isuzu
2.1.1.2. Javelin
2.1.1.3. K-Car
2.1.1.4. Lincoln
2.1.2. Mercedes
2.1.3. Nash
2.1.3.1. Opel
2.1.3.2. Pontiac
2.1.4. Quantum
2.1.4.1. Rambler
2.1.4.2. Studebaker
2.2. Toyota

2.2.1. Um, is there a car that starts with "U"?
2.3. Volkswagen

Test #2: level="any", 
         count="chapter|sect1|sect2|sect3", 
         format="1. "

1. Alfa Romeo
2. Bentley
3. Chevrolet
4. Dodge
5. Eagle
6. Ford
7. GMC
8. Honda
9. Isuzu
10. Javelin
11. K-Car
12. Lincoln
13. Mercedes
14. Nash
15. Opel
16. Pontiac
17. Quantum
18. Rambler
19. Studebaker
20. Toyota
21. Um, is there a car that starts with "U"?
22. Volkswagen

Test #3: level="single", 
         count="chapter|sect1|sect2|sect3", 
         format="1.1.1.1. "

1. Alfa Romeo
1. Bentley
2. Chevrolet
1. Dodge
1. Eagle
2. Ford
1. GMC
1. Honda
1. Isuzu
2. Javelin
3. K-Car
4. Lincoln
2. Mercedes
3. Nash
1. Opel
2. Pontiac
4. Quantum
1. Rambler
2. Studebaker
2. Toyota
1. Um, is there a car that starts with "U"?
3. Volkswagen

Test #4: level="multiple", 
         select=".//sect2",
         count="chapter|sect1|sect2", 
         format="I-A-i: "

I-B-i: Dodge
II-A-i: Honda
II-A-ii: Mercedes
II-A-iii: Nash
II-A-iv: Quantum
II-B-i: Um, is there a car that starts with "U"?

Test #5: level="any", 
         count="[various elements]"
         from="[various elements]"
         format="1.1.1.1. "

1.2.1.1. Eagle
2.1.1.1. Isuzu
2.1.1.2. Javelin
2.1.1.3. K-Car
2.1.1.4. Lincoln
2.1.3.1. Opel
2.1.3.2. Pontiac
2.1.4.1. Rambler
2.1.4.2. Studebaker

Test #6: level="any", 
         count="chapter|sect1|sect2|sect3",
         grouping-separator=",",
         using a variable to start counting at 1000.

1,000. Alfa Romeo
1,001. Bentley
1,002. Chevrolet
1,003. Dodge
1,004. Eagle
1,005. Ford
1,006. GMC
1,007. Honda
1,008. Isuzu
1,009. Javelin
1,010. K-Car
1,011. Lincoln
1,012. Mercedes
1,013. Nash
1,014. Opel
1,015. Pontiac
1,016. Quantum
1,017. Rambler
1,018. Studebaker
1,019. Toyota
1,020. Um, is there a car that starts with "U"?
1,021. Volkswagen

Test #7: level="multiple", 
         count="chapter|sect1|sect2|sect3", 
         format="1.1.1.1. ",
         selecting up to the first two <sect1> elements from chapter 2.

2.1. GMC
2.1.1. Honda
2.1.1.1. Isuzu
2.1.1.2. Javelin
2.1.1.3. K-Car
2.1.1.4. Lincoln
2.1.2. Mercedes
2.1.3. Nash
2.1.3.1. Opel
2.1.3.2. Pontiac
2.1.4. Quantum
2.1.4.1. Rambler
2.1.4.2. Studebaker
2.2. Toyota
2.2.1. Um, is there a car that starts with "U"?

テスト 1 では、level="multiple" を使用して、<chapter> 要素、<sect1> 要素、<sect2> 要素および <sect3> 要素をカウントしています。複数のレベルでこれらの要素を番号付けすると、各要素に対する数字がピリオドで区切られます。Studebaker の横にある数字は、2 つ目の <chapter> 要素内に最初の <sect1> 要素があり、その中に 4 つ目の <sect2> 要素があり、その中に 2 つ目の <sect3> 要素があることを示しています。

テスト 2 では、level="any" を使用して、<chapter> 要素、<sect1> 要素、<sect2> 要素および <sect3> 要素をカウントし順序を並べ替えています。

テスト 3 では、level="single" を使用して各レベルの要素をカウントしています。つまり、<sect2> 要素内の 4 つ目の <sect3> 要素には 4 (または ivD などの適切な値) という数字が付けられます。各要素の数字は、テスト 1 の各要素の最後の数字と同じです。

テスト 4 では、異なる点がいくつかあります。まず、大文字のアルファベットと小文字のローマ数字を使用しています。次に、複数のレベルの要素 (<chapter> 要素、<sect1> 要素、および <sect2> 要素) をカウントします。ただし、<sect2> 要素のみ処理します。<sect2> 要素のタイトルテキストのみを出力しますが、引き続き適切な複数レベルの番号を生成できます。

テスト 5 では、テスト 4 と類似した番号を生成しますが、from 属性を使用しています。<sect3> 要素を 4 段階で生成します。最初に、最初の <book> の先祖を起点に <chapter> の先祖をカウントし、次に、最初の <chapter> の先祖を起点に <sect1> の先祖をカウントします。

テスト 6 では、1 ではなく 1000 からカウントを開始します。このためには、<xsl:number> によって生成された値を変数に格納し、変数の値に 1000 を加えて出力します。<xsl:number> 要素の value 属性の式を使用できます。また、grouping-separator 属性を使用して、3 桁のグループをコンマで区切っています。

最後のテスト 7 では、2 つ目の <chapter> 要素内の最初と 2 つ目の <sect1> 要素 (position() が 3 より小さい <sect1>) の項目に対してのみ番号付けを行います。これらのセクションのみ処理していますが、引き続き <xsl:number> を使用して要素の正しい番号を生成できます。