Для создания текстового узла в конечном дереве используется элемент xsl:value- of . Обязательный атрибут select является выражением. Это выражение обрабатывается, а полученный объект преобразуется в строку как при вызове функции string. Эта строка задает строковое значение создаваемого текстового узла. Если строка пустая, текстовый узел создаваться не будет. Созданный текстовый узел будет объединен с любыми соседствующими с ним текстовыми узлами.
Чтобы скопировать набор узлов в конечное дерево, не преобразуя его в строку, можно использовать элемент xsl:copy-of. См. [11.3 Использование значений переменных и параметров с конструкцией xsl:copy- of].
Например, в следующем примере из элемента person с атрибутами given-name и family-name создается параграф HTML. Этот параграф будет содержать значение атрибута given-name из текущего узла, за которым следуют пробел и значение атрибута family-name того же текущего узла.
<xsl:template match='person'>
<p> <xsl:value-of select='@given-name'/>
<xsl:text> </xsl:text>
<xsl:value-of select='@family-name'/>
</p>
</xsl:template>
В другом примере параграф HTML создается из элемента person , имеющего непосредственными потомками элементы given-name и family-name. Полученный параграф будет содержать строковое значение первого элемента given-name – непосредственного потомка текущего узла, затем последует пробел и строковое значение первого встретившегося элемента family-name, являющегося непосредственным потомком текущего узла.
<xsl:template match='person'>
<p> <xsl:value-of select='given-name'/>
<xsl:text> </xsl:text>
<xsl:value-of select='family-name'/>
</p>
</xsl:template>
В следующем примере каждому элементу procedure предшествует параграф, содержащий уровень безопасности для этой процедуры. Предполагается, что уровень безопасности, соответствующий процедуре, определяется атрибутом security в данном элементе процедуры или в элементе, который является предком этой процедуры. Предполагается также, что если несколько таких элементов имеет атрибут security, то уровень безопасности определяется элементом, самым близким к этой процедуре.
<xsl:template match='procedure'>
<fo:block>
<xsl:value-of select='ancestor-or-self::*[@security][1]/@security'/>
</fo:block>
<xsl:apply-templates/>
</xsl:template>
7.6.2 Шаблоны значений атрибутов
В значении атрибута, которое интерпретируется как шаблон значения атрибута, например, в атрибуте в фиксированном конечном элементе, можно использовать выражение, окружив его фигурными скобками ({}). При обработке шаблона значения атрибута данное выражение с окружающими его фигурными скобками заменяется результатом обработки этого выражения, а полученный объект преобразуется в строку как при вызове функции string. В стиле XSLT в значении атрибута фигурные скобки не распознаются, если не было специально указано, что этот атрибут обрабатывается как шаблон значения атрибута. В сводном синтаксисе элемента значение таких атрибутов ставится в фигурные скобки.
Замечание: Не все атрибуты интерпретируются как шаблоны значений атрибутов. Атрибуты, значением которых является выражение или образец, атрибуты элементов верхнего уровня, а также атрибуты, ссылающиеся на именованные объекты XSLT, не интерпретируются. Кроме того, в качестве шаблонов значений атрибутов не интерпретируются атрибуты xmlns, иначе это не согласовалось бы с соответствующими рекомендациями спецификации XML Namespaces.
В следующем примере из исходного элемента photograph создается конечный элемент img, значение атрибута src в элементе img вычисляется по значению переменной image-dir и строковому значению непосредственного потомка href элемента photograph, значение атрибута width в элементе img вычисляется по значению атрибута width непосредственного потомка size элемента photograph:
<xsl:variable name='image-dir'>/images</xsl:variable>
<xsl:template match='photograph'>
<img src='{$image-dir}/{href}' width='{size/@width}'/>
</xsl:template>
Из исходного кода
<photograph>
<href>headquarters.jpg</href>
<size width='300'/>
</photograph>
будет получено