использование таблицы стилей xslt для преобразования пустых строк xhtml в пустую строку XSL-FO - PullRequest
6 голосов
/ 24 февраля 2010

Я использую таблицу стилей XSLT (Antennahouse) для преобразования XHTML в файл XSL-FO. Я определил пустую строку в своем файле XHTML как 2 последовательных тега HTML BR. Теперь нет встроенной поддержки пустой строки в формате XSL-FO. Я хочу обойти это ограничение, добавив высоту к блоку fo:, который таблица стилей вставляет для тега BR. Однако я новичок в языке XSLT, и у меня возникают некоторые проблемы с этим.

Я могу понять, как вставить эту высоту для каждого тега BR, с которым я сталкиваюсь, но я хочу, чтобы пустая строка вставлялась только тогда, когда есть два тега BR друг за другом (в противном случае пустая строка вставлялась бы после каждого следующего текста по метке БР.)

Я дошел до создания «бессмысленного» выражения (11 больше 10), которое будет определять, когда вставлять обычный fo: block или fo: block с space-after = "1em". Очевидно, что это выражение не имеет смысла, и оно должно проверять, является ли этот элемент BR вторым по счету. Если бы кто-нибудь мог помочь мне здесь или указать мне правильное направление, это было бы очень ценно. Вот что у меня сейчас:

<xsl:template match="html:br">
<xsl:choose>
    <xsl:when test="11 &gt; 10">
        <fo:block space-after="1em">
            <xsl:call-template name="process-common-attributes"/>
        </fo:block>
    </xsl:when>
    <xsl:otherwise>
        <fo:block>
            <xsl:call-template name="process-common-attributes"/>
        </fo:block>
    </xsl:otherwise>
  </xsl:choose>

Для справки, это фрагмент XHTML, в котором я хочу, чтобы двойные теги BR преобразовывались в пустую строку, но одиночные теги BR должны быть просто обычным переводом строки.

                  <div style="color: #000000; font-family: arial; font-size: 10pt; font-style: normal; font-weight: normal;">
                    <span>description</span>
                    <br/>
                    <span>using</span>
                    <br/>
                    <span>multiple</span>
                    <br/>
                    <span>lines</span>
                    <br/>
                    <br/>
                    <span>with</span>
                    <br/>
                    <br/>
                    <span>blank</span>
                    <br/>
                    <br/>
                    <span>lines</span>
                    <br/>
                </div>

Ответы [ 2 ]

4 голосов
/ 24 февраля 2010

Что-то вроде этого.

Соответствует только тем <br> s, за которыми непосредственно следует элемент (following-sibling::*[1]), который сам по себе является <br> ([self::html:br]):

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

и отбросьте те <br> s, которым непосредственно предшествует <br>, чтобы избежать удвоения пробела после. Сопоставляя их с пустым шаблоном, они фактически удаляются:

<xsl:template match="html:br[preceding-sibling::*[1][self::html:br]]" />
0 голосов
/ 07 апреля 2015

Я играл с одной и той же идеей нескольких разрывов строк.

<xsl:template match="html:br">
   <fo:block linefeed-treatment="preserve">
    <xsl:text>&#10;</xsl:text>
  </fo:block>
</xsl:template>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...