仅从父元素修剪空白

jpa*_*kal 2 xslt whitespace trim

我想修剪XML中p标签内的前导空格,所以这个:

<p>  Hey, <em>italics</em> and <em>italics</em>!</p>
Run Code Online (Sandbox Code Playgroud)

变成这样:

<p>Hey, <em>italics</em> and <em>italics</em>!</p>
Run Code Online (Sandbox Code Playgroud)

(修剪尾随空格不会受到伤害,但并非强制性.)

现在,我知道normalize-whitespace()应该这样做,但如果我尝试将它应用于文本节点..

<xsl:template match="text()">
  <xsl:text>[</xsl:text>
  <xsl:value-of select="normalize-space(.)"/>
  <xsl:text>]</xsl:text>
</xsl:template>
Run Code Online (Sandbox Code Playgroud)

...它分别应用于每个文本节点(在括号中)并将它们吸干:

[Hey,]<em>[italics]</em>[and]<em>[italics]</em>[!]
Run Code Online (Sandbox Code Playgroud)

我的XSLT看起来基本上是这样的:

<xsl:template match="p">
    <xsl:apply-templates/>
</xsl:template>
Run Code Online (Sandbox Code Playgroud)

那么有什么方法可以让apply-templates完成,然后在输出上运行normalize-space,这应该做对了吗?

小智 5

这个样式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="p//text()[1][generate-id()=
                                      generate-id(ancestor::p[1]
                                                  /descendant::text()[1])]">
        <xsl:variable name="vFirstNotSpace"
                      select="substring(normalize-space(),1,1)"/>
        <xsl:value-of select="concat($vFirstNotSpace,
                                     substring-after(.,$vFirstNotSpace))"/>
    </xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)

输出:

<p>Hey, <em>italics</em> and <em>italics</em>!</p>
Run Code Online (Sandbox Code Playgroud)

编辑2:更好的表达(现在只有三个函数调用).

编辑3:匹配第一个后代文本节点(如果它是文本节点,则不仅仅是第一个节点).感谢@ Dimitre的评论.

现在,通过这个输入:

<p><b>  Hey, </b><em>italics</em> and <em>italics</em>!</p>
Run Code Online (Sandbox Code Playgroud)

输出:

<p><b>Hey, </b><em>italics</em> and <em>italics</em>!</p>
Run Code Online (Sandbox Code Playgroud)