Как «свернуть», но не «нормализовать» пробелы в xlst - PullRequest
3 голосов
/ 09 июня 2010

У меня есть 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

Я не могу исключить содержимое смешанного режима из удаления, потому что моя первая потребность - свернуть пробелы, такие как возвраты, табуляции, отступы внутри, скажем, элемент <p>.

Есть ли способ / функция / трюк для свертывания нескольких пробелов в одном пробеле без удаления начальных и конечных пробелов?

1 Ответ

1 голос
/ 09 июня 2010

Я не думаю, что есть встроенная функция, чтобы сделать это легко, но (по крайней мере в XPath 2) есть довольно полный язык регулярных выражений с replace() функция, которую вы должны быть в состоянии убедить делать то, что вы хотите. (С более читабельным введением на xml.com ).

Я думаю, все, что вам нужно сделать, это заменить:

select="normalize-space()"

с

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

но я не проверял это.

Редактировать: Исправлен первый аргумент в замене, как отмечено Mycol ниже.

...