我有像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>
有没有一种方法/功能/技巧可以在一个空格中折叠多个空格而不删除前导空格和尾随空格?
答案 0 :(得分:1)
我不认为有一个内置函数可以轻松地做到这一点,但是(至少在XPath 2中)有一个非常完整的regular expression language具有replace()
函数,你应该能够说服你做你想做的事。 (在xml.com处有一个更易读的介绍)。
我认为您需要做的就是替换:
select="normalize-space()"
带
select="replace(., '(\s\s+)', ' ')"
但我没有测试过这个。
修改:修正了替换中的第一个参数,如下面的Mycol所示。