7.6 Computing Generated Text
Computing Generated Text
Within a template, the xsl:value-of element can be
used to compute generated text, for example by extracting text from
the source tree or by inserting the value of a variable. The
xsl:value-of element does this with an Expression that is specified as the
value of the select attribute. Expressions can
also be used inside attribute values of literal result elements by
enclosing the expression in curly braces ({}).
Generating Text with xsl:value-of[top]
Generating Text with xsl:value-of
<
value-of
select=
string-expression
disable-output-escaping=
>
<-- Content: -->
<
/value-of>
The xsl:value-of element is instantiated to create a
text node in the result tree. The required select
attribute is an Expression;
this expression is evaluated and the resulting object is converted to
a string as if by a call to the string
function. The string specifies the string-value of the created text
node. If the string is empty, no text node will be created. The
created text node will be merged with any adjacent text nodes.
The xsl:copy-of element can be used to copy a node-set
over to the result tree without converting it to a string. See [Using Values of Variables and Parameters with
].
For example, the following creates an HTML paragraph from a
person element with given-name and
family-name attributes. The paragraph will contain the value
of the given-name attribute of the current node followed
by a space and the value of the family-name attribute of the
current node.
<xsl:template match="person">
<p>
<xsl:value-of select="@given-name"/>
<xsl:text> </xsl:text>
<xsl:value-of select="@family-name"/>
</p>
</xsl:template>
For another example, the following creates an HTML paragraph from a
person element with given-name and
family-name children elements. The paragraph will
contain the string-value of the first given-name child
element of the current node followed by a space and the string-value
of the first family-name child element of the current
node.
<xsl:template match="person">
<p>
<xsl:value-of select="given-name"/>
<xsl:text> </xsl:text>
<xsl:value-of select="family-name"/>
</p>
</xsl:template>
The following precedes each procedure element with a
paragraph containing the security level of the procedure. It assumes
that the security level that applies to a procedure is determined by a
security attribute on the procedure element or on an
ancestor element of the procedure. It also assumes that if more than
one such element has a security attribute then the
security level is determined by the element that is closest to the
procedure.
<xsl:template match="procedure">
<fo:block>
<xsl:value-of select="ancestor-or-self::*[@security][1]/@security"/>
</fo:block>
<xsl:apply-templates/>
</xsl:template>
Attribute Value Templates[top]
Attribute Value Templates
In an attribute value that is interpreted as an
attribute value template, such as an attribute of a
literal result element, an Expression can be used by surrounding
the expression with curly braces ({}). The
attribute value template is instantiated by replacing the expression
together with surrounding curly braces by the result of evaluating the
expression and converting the resulting object to a string as if by a
call to the string function. Curly braces are
not recognized in an attribute value in an XSLT stylesheet unless the
attribute is specifically stated to be one that is interpreted as an
attribute value template; in an element syntax summary, the value
of such attributes is surrounded by curly braces.
NOTE:
Not all attributes are interpreted as attribute value
templates. Attributes whose value is an expression or pattern,
attributes of Top-level elements
and attributes that refer to named XSLT objects are not interpreted as
attribute value templates. In addition, xmlns attributes
are not interpreted as attribute value templates; it would not be
conformant with the XML Namespaces Recommendation to do
this.
The following example creates an img result element
from a photograph element in the source; the value of the
src attribute of the img element is computed
from the value of the image-dir variable and the
string-value of the href child of the
photograph element; the value of the width
attribute of the img element is computed from the value
of the width attribute of the size child of
the photograph element:
<xsl:variable name="image-dir">/images</xsl:variable>
<xsl:template match="photograph">
<img src="{$image-dir}/{href}" width="{size/@width}"/>
</xsl:template>
With this source
<photograph>
<href>headquarters.jpg</href>
<size width="300"/>
</photograph>
the result would be
<img src="/images/headquarters.jpg" width="300"/>
When an attribute value template is instantiated, a double left or
right curly brace outside an expression will be replaced by a single
curly brace. It is an error if a right curly brace occurs in an
attribute value template outside an expression without being followed
by a second right curly brace. A right curly brace inside a Literal in an expression is not
recognized as terminating the expression.
Curly braces are not recognized recursively inside
expressions. For example:
<a href="#{id({@ref})/title}">
is not allowed. Instead, use simply:
<a href="#{id(@ref)/title}">
|