Как я могу удалить разрывы строк из моего XML с помощью XSLT? - PullRequest
4 голосов
/ 05 июня 2010

У меня есть этот XSLT:

<xsl:strip-space elements="*" />
<xsl:template match="math">
    <img class="math">
        <xsl:attribute name="src">http://latex.codecogs.com/gif.latex?<xsl:value-of
            select="text()" /></xsl:attribute>
    </img>
</xsl:template>

Что применяется к этому XML (обратите внимание на разрыв строки):

<math>\text{average} = \alpha \times \text{data} + (1-\alpha) \times
    \text{average}</math>

К сожалению, преобразование создает это:

<img
    class="math"
    src="http://latex.codecogs.com/gif.latex?\text{average} = \alpha \times \text{data} + (1-\alpha) \times&#10;&#9;&#9;&#9;&#9;&#9;\text{average}" />

Обратите внимание на символы пробельных символов. Хотя это работает, это ужасно грязно. Как я могу предотвратить это?

Ответы [ 3 ]

4 голосов
/ 05 июня 2010

Недостаточно использовать функцию normalize-space(), когда она покидает середину!

Вот простое и полное решение:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes"/>
 <xsl:strip-space elements="*" />

 <xsl:template match="math">
    <img class="math">
        <xsl:attribute name="src">http://latex.codecogs.com/gif.latex?<xsl:value-of
            select="translate(.,' &#9;&#10;', '')" /></xsl:attribute>
    </img>
 </xsl:template>
</xsl:stylesheet>

Когда это преобразование применяется к предоставленному документу XML :

<math>\text{average} = \alpha \times \text{data} + (1-\alpha) \times
    \text{average}</math>

желаемый, правильный результат получается :

<img class="math" src="http://latex.codecogs.com/gif.latex?\text{average}=\alpha\times\text{data}+(1-\alpha)\times\text{average}" />

Примечание :

  1. Использование функции XPath 1.0 translate() для удаления всех нежелательных символов.

  2. Здесь нет необходимости использовать функцию replace() - ее невозможно использовать, поскольку она доступна только в XPath 2.0.

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

Функция normalize-space удаляет начальные и конечные пробелы и заменяет последовательности пробельных символов одним пробелом. Без параметров он будет работать со строковым значением узла контекста.

<xsl:template match="math">
    <img class="math">
        <xsl:attribute name="src">http://latex.codecogs.com/gif.latex?<xsl:value-of select="normalize-space()" /></xsl:attribute>
    </img>
</xsl:template>

Также ваша таблица стилей может быть упрощена с помощью шаблона значения атрибута вместо xsl:attribute.

<xsl:template match="math">
    <img class="math" src="http://latex.codecogs.com/gif.latex?{normalize-space()}" />
</xsl:template>
1 голос
/ 05 июня 2010

Я не уверен, как вы генерируете текст. Но есть два пути:

  1. Вы можете использовать элемент xsl: strip-spac e, который доступен в XSLT.

  2. Если вы генерируете текст во время процесса XSLT, то другим способом достижения будет использование методов строкового процесса: normalize-space и замена методов .

...