Элементы <xsl:strip-space> и <xsl:preserve-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. Обратите внимание на то, что убраны все символы-разделители, в том числе все символы новой строки:
<?xml version="1.0" encoding="utf-8"?><PLANETS><PLANET><NAME>Mercury</NAME><MASS>.0553</MASS><DAY>58.65</DAY><RADIUS>1516</RADIUS><DENSITY>.983</DENSITY><DISTANCE>43.4</DISTANCE></PLANET><PLANET><NAME>Venus</NAME><MASS>.815</MASS><DAY>116.75</DAY><RADIUS>3716</RADIUS><DENSITY>.943</DENSITY><DISTANCE>66.8</DISTANCE></PLANET><PLANET><NAME>Earth</NAME><MASS>1</MASS><DAY>1</DAY><RADIUS>2107</RADIUS><DENSITY>1</DENSITY><DISTANCE>128.4</DISTANCE></PLANET></PLANETS>
Заметьте, что таким образом удаляются только чистые узлы-разделители. Например, текст элемента <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>, все равно можно указать, в каком элементе или элементах нужно сохранить узлы-разделители, установив атрибут elements элемента <xsl:preserve-space> в список этих элементов:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:strip-space elements="*"/>
<xsl:preserve-space elements="MASS RADIUS"/>
<xsl:output method="xml"/>
<xsl:template match="*">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Обсужденные средства удаления и сохранения разделителей могут показаться слишком сложными для форматирования выходных документов выравнивающими пробелами, но, к счастью, существует простой способ: атрибут indent элемента <xsl:output> позволяет автоматически выровнять выходной документ.