Существует три причины получения нежелательных пробелов в результате преобразования XSLT:
- пробелы, которые появляются между узлами в исходном документе
- пробелы, которые находятся внутри узлов исходного документа
- пробел, полученный из таблицы стилей
Я собираюсь поговорить обо всех трех, потому что может быть трудно определить, откуда появляются пробелы, поэтому вам, возможно, придется использовать несколько стратегий.
Чтобы устранить пробелы, которые находятся между узлами в вашем исходном документе, вы должны использовать <xsl:strip-space>
для удаления любых пробелов, которые появляются между двумя узлами, а затем использовать <xsl:preserve-space>
для сохранения значительных пробелов, которые могут появиться в смешанном контенте. , Например, если ваш исходный документ выглядит так:
<ul>
<li>This is an <strong>important</strong> <em>point</em></li>
</ul>
тогда вы захотите проигнорировать пробел между <ul>
и <li>
и между </li>
и </ul>
, что не имеет значения, но сохранить пробел между <strong>
и <em>
элементы, которые значимы (в противном случае вы получите "Это ** важный *** пункт *"). Для этого используйте
<xsl:strip-space elements="*" />
<xsl:preserve-space elements="li" />
Атрибут elements
в <xsl:preserve-space>
должен в основном перечислять все элементы в вашем документе, которые имеют смешанное содержимое.
В сторону: использование <xsl:strip-space>
также уменьшает размер исходного дерева в памяти и делает вашу таблицу стилей более эффективной, так что это стоит делать, даже если у вас нет таких проблем с пробелами.
Чтобы устранить пробелы, которые появляются внутри узлов в вашем исходном документе, вы должны использовать normalize-space()
. Например, если у вас есть:
<dt>
a definition
</dt>
и вы можете быть уверены, что элемент <dt>
не будет содержать элементы, с которыми вы хотите что-то сделать, тогда вы можете сделать:
<xsl:template match="dt">
...
<xsl:value-of select="normalize-space(.)" />
...
</xsl:template>
Начальный и конечный пробелы будут удалены из значения элемента <dt>
, и вы просто получите строку "a definition"
.
Для устранения пробелов из таблицы стилей, которая, возможно, является той, которую вы испытываете, - это когда у вас есть текст в шаблоне, подобный этому:
<xsl:template match="name">
Name:
<xsl:value-of select="." />
</xsl:template>
Таблицы стилей XSLT анализируются так же, как и исходные документы, которые они обрабатывают, поэтому приведенный выше XSLT интерпретируется как дерево, содержащее элемент <xsl:template>
с атрибутом match
, первый дочерний элемент которого является текстовым узлом и чей Второй дочерний элемент - это элемент <xsl:value-of>
с атрибутом select
. Текстовый узел имеет начальные и конечные пробелы (включая разрывы строк); поскольку это буквальный текст в таблице стилей, он буквально копируется в результат со всеми начальными и конечными пробелами.
Но некоторые пробелы в таблицах стилей XSLT автоматически удаляются, а именно между узлами. Вы не получаете разрыв строки в своем результате, потому что есть разрыв строки между <xsl:value-of>
и закрытием <xsl:template>
.
Чтобы получить только нужный текст в результате, используйте элемент <xsl:text>
, например:
<xsl:template match="name">
<xsl:text>Name: </xsl:text>
<xsl:value-of select="." />
</xsl:template>
Процессор XSLT будет игнорировать разрывы строк и отступы, которые появляются между узлами, и выводит только текст внутри элемента <xsl:text>
.