| <xsl:number> | |
| 対象項目をカウントします。通常、この要素はドキュメントの部分をカウントするために使用されますが、数値の書式を設定するためにも使用できます。 | |
| カテゴリ | |
|
命令 |
|
| 必須の属性 | |
|
なし。 |
|
| 省略可能な属性 | |
|
|
| コンテンツ | |
|
なし。<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 (または iv や D などの適切な値) という数字が付けられます。各要素の数字は、テスト 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> を使用して要素の正しい番号を生成できます。 |
|