Чистые узлы-разделители не копируются из таблицы стилей в выходной документ, если только они не находятся внутри элемента
<xsl:text>
,
или у элемента, в который они вложены, атрибут
xml:space
не установлен в «preserve» (сохранить).
С другой стороны, по умолчанию XSLT сохраняет текстовые узлы разделители в исходном документе и копирует их в результирующий документ. Возьмите уже рассмотренную нами копирующую таблицу стилей, которая копирует все элементы из исходного документа в результирующий:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml"/>
<xsl:template match="*">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
и примените ее к
planets.xml
; все символы-разделители будут также скопированы в результирующий документ:
Тем не менее, иногда требуется удалить разделители, используемые при форматировании входных документов — это можно сделать при помощи элемента
<xsl:strip-space>
.
Элементы <xsl:strip-space> и <xsl:preserve-space>
Элемент
<xsl:strip-space>
дает указание процессору XSLT убрать все чистые узлы-разделители (также называемые «потребляемыми», expendable, узлами-разделителями) из. выходного документа. Чистый узел-разделитель состоит только из символов-разделителей и не содержит текст какого-либо другого вида. У этого элемента только один атрибут:
•
elements
(обязательный). Задает элементы, из которых нужно убрать символы-разделители. Представляет, собой список разделённых символами-разделителями
NameTest
(именами или обобщёнными именами с символами подстановок).
Элемент
не включает содержимого. Например, чтобы удалить все узлы-разделители из
planets.xml
, можно применить
<xsl:strip-space elements="*"/>
следующим образом:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:strip-space elements="*"/>
<xsl:output method="xml"/>
<xsl:template match="*">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Вот результирующий документ, полученный после применения этой таблицы стилей к
planets.xml
. Обратите внимание на то, что убраны все символы-разделители, в том числе все символы новой строки:
Заметьте, что таким образом удаляются только чистые узлы-разделители. Например, текст элемента
<TITLE>Volcanoes for Dinner</TITLE>
не содержит чистых текстовых узлов-разделителей, поэтому текст «Volcanoes for Dinner» будет сохранен в выходном документе вместе с пробелами. Так будет даже тогда, когда текст будет содержать несколько пробелов подряд, как в «Volcanoes for Dinner».
В некоторых ситуациях может потребоваться не удалять все узлы-разделители из всего документа; задать элементы, в которых следует сохранить узлы-разделители, можно при помощи элемента
<xsl:preserve-space>
. У этого элемента такой же атрибут, что и у
<xsl:strip-space>
:
•
elements
(обязательный). Задает элементы, в которых нужно сохранить символы-разделители. Представляет собой список разделенных символами-разделителями
NameTest
(именами или обобщенными именами с символами подстановок).
Фактически элемент
<xsl:preserve-space>
является элементом по умолчанию для всех элементов в XSLT. Если вы использовали элемент
<xsl:strip-space>
, все равно можно указать, в каком элементе или элементах нужно сохранить узлы-разделители, установив атрибут