Валиков Алексей Н.
Шрифт:
<xsl:text>href="#" type="text/xsl"</xsl:text>
</xsl:processing-instruction>
Результирующий документ будет содержать инструкцию по обработке в виде:
<?xml-stylesheet href="#" type="text/xsl"?>
Элемент
xsl:processing-instruction
не может создать декларацию XML, несмотря на то, что с точки зрения синтаксиса (но не семантики) она имеет форму инструкции по обработке. Для вывода XML-декларации следует использовать элемент xsl:output
. Копирование узлов
Преобразование может включать в себя не только создание новых, но и копирование существующих узлов. Для этого можно использовать элементы
xsl:copy
и xsl:copy-of
, использование которых будет подробно разобрано ниже. Элемент xsl:copy
Ниже представлена синтаксическая конструкция этого элемента:
<xsl:copy
use-attribute-sets = "наборы атрибутов">
<!-- Содержимое: шаблон -->
</xsl:copy>
Элемент
xsl:copy
создает копию текущего узла вне зависимости от его типа. Вместе с текущим узлом в выходящее дерево копируются только узлы пространств имен, ассоциированные с ним. Дочерние узлы и узлы атрибутов в выходящий документ не копируются. Если
xsl:copy
используется для копирования корневого узла или узда элемента, в выходящем документе процессор создает дочерний фрагмент дерева, являющийся результатом выполнения шаблона, содержащегося в xsl:copy
. Пример
Предположим, что в каждый элемент преобразовываемого документа нам нужно добавить атрибут
element-count
со значением, равным количеству его дочерних элементов, а все остальные узлы оставить, как есть. Листинг 7.17. Входящий документ
<а> text
<b attr="value"/>
<c/>
<d>
text
<e/>
</d>
</a>
Листинг 7.18. Шаблон преобразования
<xsl:template match="@*|node">
<xsl:copy>
<xsl:attribute name="element-count">
<xsl:value-of select="count(*) "/>
</xsl:attribute>
<xsl:apply-templates select="@*|node"/>
</xsl:copy>
</xsl:template>
Листинг 7.19. Выходящий элемент
<a element-count="3">
text
<b element-count="0" attr="value"/>
<c element-count="0"/>
<d element-count="1">
text
<e element-count="0"/>
</d>
</a>
Если
xsl:copy
используется для создания в выходящем документе копии узла элемента, в него при помощи атрибута use-attribute-sets
могут быть также включены именованные наборы атрибутов (см. раздел "Именованные наборы атрибутов" данной главы). Пример
Предыдущее преобразование может быть переписано в виде
<xsl:attribute-set name="elements">
<xsl:attribute name="element-count">
<xsl:value-of select="count(*)"/>
</xsl:attribute>
</xsl:attribute-set>
<xsl:template match="@*|node">
<xsl:copy use-attribute-sets="elements">
<xsl:apply-templates select="@*|node"/>
</xsl:copy>
</xsl:template>
Результат преобразования будет абсолютно идентичен выходящему документу, полученному в предыдущем примере.
Элемент xsl:copy-of
Синтаксис элемента несложен:
<xsl:copy-of
select="выражение"/>