Возможно, вы заметили, что во многих примерах результирующих документов наблюдается несколько странное форматирование. Причина в том, что в исходных документах необходимо было разбивать длинные элементы на несколько строк, чтобы они умещались между полями данной книги. К сожалению, дополнительные пробелы и символы форматирования (переводы строки, табуляция и так далее) переносятся из исходного документа в выходной в неизменном виде. Для компьютера лишние пробелы и символы форматирования не имеют значения, но для человека они важны.
Дефолтное поведение при чтении текстовых узлов исходного документа, например, содержимого элементов ATOMIC_NUMBER
или DENSITY
- сохранение всех пробелов и символов форматирования. Типичный элемент DENSITY
выглядит так:
<DENSITY UNITS="grams/cubic centimeter"> <!-- At 300K, 1 atm --> 0.0000899 </DENSITY>
Когда берется значение этого элемента, сохраняются все лишние пробелы до и после текста, несмотря на то, что они нужны только для того, чтобы текст влез на печатную страницу:
0.0000899
Для удаления лишних пробелов из этой и других строк можно использовать функцию normalize-space()
. Например, вместо <xsl:value-of select="DENSITY"/>
следует написать <xsl:value-of
select="normalize-space(DENSITY)"/>
.
Можно автоматически удалять из исходного документа текстовые узлы, которые содержат только пробелы, используя элемент xsl:strip-space
. Атрибут elements
этого элемента верхнего уровня содержит список элементов, текстовые узлы которых, если они содержат только пробелы, будут удаляться. Например, следующая инструкция указывает, что из элементов DENSITY
, NAME
, SYMBOL
и BOILING_POINT
следует удалить все текстовые узлы, если они содержат только пробелы:
<xsl:strip-space elements="DENSITY NAME SYMBOL BOILING_POINT"/>
Используя звездочку *
, можно удалить узлы, содержащие только пробелы с помощью следующей инструкции:
<xsl:strip-space elements="*"/>
Существует также и элемент xsl:preserve-space
. Он имеет аналогичный синтаксис, но противоположное значение. Но, поскольку сохранение пробелов и символов форматирования - это дефолтное поведение, этот элемент используется редко. Его главное назначение - переиграть элемент xsl:strip-space
, импортированный из другой таблицы стилей или задать несколько элементов, в которых пробелы сохраняются, если дефолтное поведение было сброшено инструкцией <xsl:strip-space elements="*"/>
.
Иное дело текстовые узлы, содержащие только пробелы в выходном документе. Они по умолчанию удаляются. Если вы хотите какой-то из них сохранить, нужно добавить атрибут xml:space
со значением preserve
его родительскому узлу или любому другому его узлу-предку.
Атрибут xml:space
обсуждался в главе 11.
Иногда самым простым способом включить в таблицу стилей важный пробел или символ форматирования - заключить его в элемент xsl:text
. Пробелы внутри элемента xsl:text
трактуются буквально и никогда не удаляются.