Некоторое время назад я задал этот вопрос: с помощью таблицы стилей 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>
Я открыт для предложений.