7.7 Numbering
Numbering
<
number
level=
count=
pattern
from=
pattern
value=
number-expression
format=
{
string
}
lang=
{
nmtoken
}
letter-value=
{
}
grouping-separator=
{
char
}
grouping-size=
{
number
}
>
<-- Content: -->
<
/number>
The xsl:number element is used to insert a formatted
number into the result tree. The number to be inserted may be
specified by an expression. The value attribute contains
an Expression. The expression
is evaluated and the resulting object is converted to a number as if
by a call to the number function. The number is
rounded to an integer and then converted to a string using the
attributes specified in [Number to String Conversion Attributes]; in this
context, the value of each of these attributes is
interpreted as an Attribute Value Template. After conversion, the resulting string is
inserted in the result tree. For example, the following example
numbers a sorted list:
<xsl:template match="items">
<xsl:for-each select="item">
<xsl:sort select="."/>
<p>
<xsl:number value="position()" format="1. "/>
<xsl:value-of select="."/>
</p>
</xsl:for-each>
</xsl:template>
If no value attribute is specified, then the
xsl:number element inserts a number based on the position
of the current node in the source tree. The following attributes
control how the current node is to be numbered:
-
The level attribute specifies what levels of the
source tree should be considered; it has the values
single, multiple or any. The
default is single.
-
The count attribute is a pattern that specifies
what nodes should be counted at those levels. If count
attribute is not specified, then it defaults to the pattern that
matches any node with the same node type as the current node and, if
the current node has an expanded-name, with the same expanded-name as
the current node.
-
The from attribute is a pattern that specifies
where counting starts.
In addition, the attributes specified in [Number to String Conversion Attributes]
are used for number to string conversion, as in the case when the
value attribute is specified.
The xsl:number element first constructs a list of
positive integers using the level, count and
from attributes:
-
When level="single", it goes up to the first
node in the ancestor-or-self axis that matches
the count pattern, and constructs a list of length one
containing one plus the number of preceding siblings of that ancestor
that match the count pattern. If there is no such
ancestor, it constructs an empty list. If the from
attribute is specified, then the only ancestors that are searched are
those that are descendants of the nearest ancestor that matches the
from pattern. Preceding siblings has the same meaning
here as with the preceding-sibling axis.
-
When level="multiple", it constructs a list of all
ancestors of the current node in document order followed by the
element itself; it then selects from the list those nodes that match
the count pattern; it then maps each node in the list to
one plus the number of preceding siblings of that node that match the
count pattern. If the from attribute is
specified, then the only ancestors that are searched are those that
are descendants of the nearest ancestor that matches the
from pattern. Preceding siblings has the same meaning
here as with the preceding-sibling axis.
-
When level="any", it constructs a list of length
one containing the number of nodes that match the count
pattern and belong to the set containing the current node and all
nodes at any level of the document that are before the current node in
document order, excluding any namespace and attribute nodes (in other
words the union of the members of the preceding and
ancestor-or-self axes). If the from
attribute is specified, then only nodes after the first node before
the current node that match the from pattern are
considered.
The list of numbers is then converted into a string using the
attributes specified in [Number to String Conversion Attributes]; in this
context, the value of each of these attributes is
interpreted as an Attribute Value Template. After conversion, the resulting string is
inserted in the result tree.
The following would number the items in an ordered list:
<xsl:template match="ol/item">
<fo:block>
<xsl:number/><xsl:text>. </xsl:text><xsl:apply-templates/>
</fo:block>
<xsl:template>
The following two rules would number title elements.
This is intended for a document that contains a sequence of chapters
followed by a sequence of appendices, where both chapters and
appendices contain sections, which in turn contain subsections.
Chapters are numbered 1, 2, 3; appendices are numbered A, B, C;
sections in chapters are numbered 1.1, 1.2, 1.3; sections in
appendices are numbered A.1, A.2, A.3.
<xsl:template match="title">
<fo:block>
<xsl:number level="multiple"
count="chapter|section|subsection"
format="1.1 "/>
<xsl:apply-templates/>
</fo:block>
</xsl:template>
<xsl:template match="appendix//title" priority="1">
<fo:block>
<xsl:number level="multiple"
count="appendix|section|subsection"
format="A.1 "/>
<xsl:apply-templates/>
</fo:block>
</xsl:template>
The following example numbers notes sequentially within a
chapter:
<xsl:template match="note">
<fo:block>
<xsl:number level="any" from="chapter" format="(1) "/>
<xsl:apply-templates/>
</fo:block>
</xsl:template>
The following example would number H4 elements in HTML
with a three-part label:
<xsl:template match="H4">
<fo:block>
<xsl:number level="any" from="H1" count="H2"/>
<xsl:text>.</xsl:text>
<xsl:number level="any" from="H2" count="H3"/>
<xsl:text>.</xsl:text>
<xsl:number level="any" from="H3" count="H4"/>
<xsl:text> </xsl:text>
<xsl:apply-templates/>
</fo:block>
</xsl:template>
Number to String Conversion Attributes[top]
Number to String Conversion Attributes
The following attributes are used to control conversion of a list
of numbers into a string. The numbers are integers greater than
0. The attributes are all optional.
The main attribute is format. The default value for
the format attribute is 1. The
format attribute is split into a sequence of tokens where
each token is a maximal sequence of alphanumeric characters or a
maximal sequence of non-alphanumeric characters. Alphanumeric means
any character that has a Unicode category of Nd, Nl, No, Lu, Ll, Lt,
Lm or Lo. The alphanumeric tokens (format tokens) specify the format
to be used for each number in the list. If the first token is a
non-alphanumeric token, then the constructed string will start with
that token; if the last token is non-alphanumeric token, then the
constructed string will end with that token. Non-alphanumeric tokens
that occur between two format tokens are separator tokens that are
used to join numbers in the list. The nth format token
will be used to format the nth number in the list. If
there are more numbers than format tokens, then the last format token
will be used to format remaining numbers. If there are no format
tokens, then a format token of 1 is used to format all
numbers. The format token specifies the string to be used to
represent the number 1. Each number after the first will be separated
from the preceding number by the separator token preceding the format
token used to format that number, or, if there are no separator
tokens, then by . (a period character).
Format tokens are a superset of the allowed values for the
type attribute for the OL element in HTML
4.0 and are interpreted as follows:
-
Any token where the last character has a decimal digit value
of 1 (as specified in the Unicode character property database),
and the Unicode value of preceding characters is one less than the
Unicode value of the last character generates a decimal
representation of the number where each number is at least as long as
the format token. Thus, a format token 1 generates the
sequence 1 2 ... 10 11 12 ..., and a format token
01 generates the sequence 01 02 ... 09 10 11 12
... 99 100 101.
-
A format token A generates the sequence A
B C ... Z AA AB AC....
-
A format token a generates the sequence a
b c ... z aa ab ac....
-
A format token i generates the sequence i
ii iii iv v vi vii viii ix x ....
-
A format token I generates the sequence I
II III IV V VI VII VIII IX X ....
-
Any other format token indicates a numbering sequence that
starts with that token. If an implementation does not support a
numbering sequence that starts with that token, it must use a format
token of 1.
When numbering with an alphabetic sequence, the lang
attribute specifies which language's alphabet is to be used; it has
the same range of values as xml:lang [XML];
if no lang value is specified, the language should be
determined from the system environment. Implementers should document
for which languages they support numbering.
NOTE:
Implementers should not make any assumptions about how
numbering works in particular languages and should properly research
the languages that they wish to support. The numbering conventions of
many languages are very different from English.
The letter-value attribute disambiguates between
numbering sequences that use letters. In many languages there are two
commonly used numbering sequences that use letters. One numbering
sequence assigns numeric values to letters in alphabetic sequence, and
the other assigns numeric values to each letter in some other manner
traditional in that language. In English, these would correspond to
the numbering sequences specified by the format tokens a
and i. In some languages, the first member of each
sequence is the same, and so the format token alone would be
ambiguous. A value of alphabetic specifies the
alphabetic sequence; a value of traditional specifies the
other sequence. If the letter-value attribute is not
specified, then it is implementation-dependent how any ambiguity is
resolved.
NOTE:
It is possible for two conforming XSLT processors not to
convert a number to exactly the same string. Some XSLT processors may not
support some languages. Furthermore, there may be variations possible
in the way conversions are performed for any particular language that
are not specifiable by the attributes on xsl:number.
Future versions of XSLT may provide additional attributes to provide
control over these variations. Implementations may also use
implementation-specific namespaced attributes on
xsl:number for this.
The grouping-separator attribute gives the separator
used as a grouping (e.g. thousands) separator in decimal numbering
sequences, and the optional grouping-size specifies the
size (normally 3) of the grouping. For example,
grouping-separator="," and grouping-size="3"
would produce numbers of the form 1,000,000. If only one
of the grouping-separator and grouping-size
attributes is specified, then it is ignored.
Here are some examples of conversion specifications:
-
format="ア" specifies Katakana
numbering
-
format="イ" specifies Katakana
numbering in the "iroha" order
-
format="๑" specifies numbering with
Thai digits
-
format="א" letter-value="traditional"
specifies "traditional" Hebrew numbering
-
format="ა" letter-value="traditional"
specifies Georgian numbering
-
format="α" letter-value="traditional"
specifies "classical" Greek numbering
-
format="а" letter-value="traditional"
specifies Old Slavic numbering
|