我有一个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()还会删除前导和替代空格,因此一切进展顺利,所以我有一些不可取的行为,例如
c'era<del rend="tratto a matita">anche</del>Mirella

我不能从删除中排除混合模式内容,因为我的首要需求是折叠空格,例如返回,制表符和INSIDE标识,例如<p>元素。

是否有一种方法/功能/技巧可以折叠单个空格中的多个空格,而无需删除前导空格和尾随空格?

最佳答案

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

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

select="normalize-space()"


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

但我还没有测试

编辑:修复了replace中的第一个参数,如以下Mycol所述。

07-26 06:56