如何在xslt中“折叠”但不“规范化”空格

时间:2010-06-09 14:50:11

标签: xslt whitespace

我有像xml / tei一样的

 <p> In trattoria scoprii che c'era <del rend="tratto a matita">anche</del> Mirella,
                non la non vedevo da almeno sei anni. 
                La spianata dava infatti l'impressione di fango secco, <del rend="matita">divorato
                    dalle rughe</del><add place="margine sinistro" rend="matita">attraversato da
                    lunghe ferite nere</add>. Lontano si vedeva una montagna di creta dello
                stesso colore della mota. </p>

我正在使用此样式表来删除元素和内部文本节点之间的空格。

    <xsl:strip-space elements="*"/>

<xsl:template match="/">
    <xsl:apply-templates />
</xsl:template>

<xsl:template match="*">
    <xsl:copy>
        <xsl:for-each select="@*">
            <xsl:attribute name="{name()}">
                <xsl:value-of select="normalize-space()"/>
            </xsl:attribute>
        </xsl:for-each>
        <xsl:apply-templates/>
    </xsl:copy>
</xsl:template>
<xsl:template match="text()">
    <xsl:value-of select="normalize-space()"/>
</xsl:template>

一切顺利,因为normalize-space()也删除了前导空格和traling空格,所以我有一些不加考虑的行为,比如

c'era<del rend="tratto a matita">anche</del>Mirella

我无法从删除中排除混合模式内容,因为我首先需要折叠空格,例如返回,制表符,INSIDE,例如<p>元素。< / p>

有没有一种方法/功能/技巧可以在一个空格中折叠多个空格而不删除前导空格和尾随空格?

1 个答案:

答案 0 :(得分:1)

我不认为有一个内置函数可以轻松地做到这一点,但是(至少在XPath 2中)有一个非常完整的regular expression language具有replace()函数,你应该能够说服你做你想做的事。 (在xml.com处有一个更易读的介绍)。

我认为您需要做的就是替换:

select="normalize-space()"

select="replace(., '(\s\s+)', ' ')"

但我没有测试过这个。

修改:修正了替换中的第一个参数,如下面的Mycol所示。