在不使用normalize-space的情况下删除混合内容元素中的空间

时间:2016-07-30 09:19:36

标签: xslt xslt-2.0

我得到了这样的输入:

<p><span class="someclass"/> Tekst <i>italic</i> etc..</p>
<p> Tekst <i>italic</i> etc..</p>

我希望输出为:

<p><span class="someclass"/>Tekst <i>italic</i> etc..</p>
<p>Tekst <i>italic</i> etc..</p>

如果我在混合内容模型中使用normalize-space(。),我还将删除&lt; i&gt; -element之前和之后的空格。

<p><span class="someclass"/>Tekst<i>italic</>etc..</p>
<p>Tekst<i>italic</i>etc..</p>

有解决这个问题的好方法吗?

1 个答案:

答案 0 :(得分:1)

如果您要做的只是删除text()元素的第一个p子节点中的前导空格,那么使用XSLT 3.0可以使用

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:math="http://www.w3.org/2005/xpath-functions/math"
    exclude-result-prefixes="xs math"
    version="3.0">

    <xsl:mode on-no-match="shallow-copy"/>

    <xsl:template match="p/text()[1]">
        <xsl:value-of select="replace(., '^\s+', '')"/>
    </xsl:template>

</xsl:stylesheet>

并使用XSLT 2.0,您必须拼出<xsl:mode on-no-match="shallow-copy"/>作为身份转换模板

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:math="http://www.w3.org/2005/xpath-functions/math"
    exclude-result-prefixes="xs math"
    version="2.0">

    <xsl:template match="@* | node()">
      <xsl:copy>
         <xsl:apply-templates select="@* | node()"/>
      </xsl:copy>
    </xsl:template>

    <xsl:template match="p/text()[1]">
        <xsl:value-of select="replace(., '^\s+', '')"/>
    </xsl:template>

</xsl:stylesheet>