我有一个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所述。