Проверка содержимого текста в XSLT при попытке вставить пустые строки - PullRequest
0 голосов
/ 13 апреля 2011

Некоторое время назад я задал этот вопрос: с помощью таблицы стилей xslt для преобразования пустых строк xhtml в пустую строку XSL-FO

Тем не менее, у меня теперь есть похожая проблема, для которой предложенное исправление не будет работать.

Предыдущее решение выглядело так:

  <xsl:template match="html:br[following-sibling::*[1][self::html:br]]">
    <fo:block space-after="1em">
      <xsl:call-template name="process-common-attributes"/>
    </fo:block>
  </xsl:template>

 <xsl:template match="html:br[preceding-sibling::*[1][self::html:br]]" />

  <xsl:template match="html:br">
    <fo:block>
      <xsl:call-template name="process-common-attributes"/>
    </fo:block>
  </xsl:template>

но теперь у меня есть кусок HTML, похожий на этот:

<p>text<br />text<br />text<br /><br /><br />text</p>

Разница с предыдущим постом в том, что здесь у меня нет элементов для текста (например, span), но я просто чередую фрагменты текста и элементы br. Это неправильно даст положительные результаты для всех br в моем примере. К сожалению, я не могу контролировать ввод HTML.

Идеальным решением, которое я могу придумать, было бы вставить fo: block с высотой 1em только тогда, когда между следующим br и этим текстом не было текста. Кто-нибудь знает, как добиться этого или лучшее решение для этой проблемы (я не хочу заменять все теги br на \ n и установить для сохранения linefeed-treatment, так как это откроет новую банку с червями)

Редактировать: желаемый результат будет следующим:

text
text
text


text

Таким образом, он должен сохранять (несколько) разрывов строк, но не добавлять дополнительные белые линии после одиночных <br>.

Как это может выглядеть в XSL-FO (с начальным блоком с пробелом до и пробелом после преобразования элемента

)

                <fo:block space-after="1em" space-before="1em">text
                  <fo:block/>text
                  <fo:block/>text
                  <fo:block space-after="1em"/>
                  <fo:block space-after="1em"/>
                  <fo:block/>text
                </fo:block>

Я открыт для предложений.

1 Ответ

2 голосов
/ 14 апреля 2011

Эта таблица стилей:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:fo="http://www.w3.org/1999/XSL/Format">
    <xsl:template match="p">
        <fo:block space-after="1em" space-before="1em">
            <xsl:apply-templates/>
        </fo:block>
    </xsl:template>
    <xsl:template match="br[following-sibling::node()[1]/self::br]">
        <fo:block space-after="1em"/>
    </xsl:template>
    <xsl:template match="br">
        <fo:block/>
    </xsl:template>
</xsl:stylesheet>

Вывод:

<fo:block space-after="1em" space-before="1em"
 xmlns:fo="http://www.w3.org/1999/XSL/Format">text
    <fo:block />text
    <fo:block />text
    <fo:block space-after="1em" />
    <fo:block space-after="1em" />
    <fo:block />text
</fo:block>
...