Я бы сделал что-то вроде этого:
<xsl:template match="p">
<xsl:apply-templates/>
</xsl:template>
<!-- strip leading whitespace -->
<xsl:template match="p/node()[1][self::text()]">
<xsl:call-template name="left-trim">
<xsl:with-param name="s" value="."/>
</xsl:call-template>
</xsl:template>
Это уберет левое пространство от начального дочернего узла элемента <p>
, если это текстовый узел.Он не будет очищать пространство от первого дочернего узла текста, если это не первый дочерний узел.Например,
<p><em>Hey</em> there</p>
Я намеренно стараюсь не убирать пробел в начале «там», потому что это приведет к тому, что слова будут отображаться вместе при визуализации в браузере.Если вы хотите удалить этот пробел, измените шаблон соответствия на
match="p/text()[1]"
Если вы также хотите убрать конечные пробелы, как это возможно из вашего заголовка, добавьте два следующих шаблона:
<!-- strip trailing whitespace -->
<xsl:template match="p/node()[last()][self::text()]">
<xsl:call-template name="right-trim">
<xsl:with-param name="s" value="."/>
</xsl:call-template>
</xsl:template>
<!-- strip leading/trailing whitespace on sole text node -->
<xsl:template match="p/node()[position() = 1 and
position() = last()][self::text()]"
priority="2">
<xsl:value-of select="normalize-space(.)"/>
</xsl:template>
Определения шаблонов обрезки слева и справа приведены в Шаблон обрезки для XSLT (не проверено).Они могут быть медленными для документов с большим количеством <p>
с.Если вы можете использовать XSLT 2.0, вы можете заменить шаблоны вызовов на
<xsl:value-of select="replace(.,'^\s+','')" />
и
<xsl:value-of select="replace(.,'\s+$','')" />
(благодаря Priscilla Walmsley .)