fo:встроенные элементы создают нежелательные пробелы

#xml #xslt #whitespace #xsl-fo

Вопрос:

Из XML-файла (первоначально файла Word) я создаю PDF с помощью XSLT и XSLFO. Необходимо использовать жирный шрифт. Это работает, но PDF-файл содержит ненужные пробелы, выделенные жирным шрифтом (см. «нежелательный результат»). Причина в том, что fo:inline создает пробелы внутри fo:block (слово непонятно разбивает некоторые слова на несколько w:t элементов). Визуализатор — ЩЕГОЛЬ.

Я понятия не имею, как отключить создание пробела. Я уже пробовал некоторые настройки пробелов, такие как xsl:strip-space elements и white-space-collapse , но безуспешно.

Почему таблица стилей создает пробелы между fo:inline ними и как я могу это исправить?

Нежелательный Результат

из PDF-файла: «… weil Fi l mmaterial in der …»

Желаемый Результат

Это должно быть: «… weil Filmmaterial in der …»

ИСТОЧНИК, сокращенный некоторыми элементами (которые не являются решающими) для ясности

     <div class="listlevel-1">
      <w:p>
        <w:r>
          <w:t>... weil </w:t>
        </w:r>
        <w:r>
          <w:t>Fi</w:t>
        </w:r>
        <w:r>
          <w:t>l</w:t>
        </w:r>
        <w:r>
          <w:t>mmaterial</w:t>
        </w:r>
        <w:r>
          <w:t> in der digitalen ...</w:t>
        </w:r>
      </w:p>
    </div>
 

XSLT-Таблица стилей, сокращенная некоторыми элементами (которые не являются решающими) для ясности

2 Таблицы стилей XSLT переплетаются во время преобразования. Проблема возникает в списках. Одна таблица стилей преобразует списки (1), вторая преобразует все текстовые элементы (элементы w:t), выделенные жирным шрифтом, курсивом или подчеркиванием.

1)

     <xsl:template match="//div[@class = 'listlevel-1']/w:p">
        <fo:list-item xsl:use-attribute-sets="listitem">
            <fo:list-item-label xsl:use-attribute-sets="itemlabel">
                <fo:block>•</fo:block>
            </fo:list-item-label>
                <fo:list-item-body xsl:use-attribute-sets="itembody">
                    <fo:block>
                        <xsl:apply-templates select="w:r/w:t"/>
                    </fo:block>
                </fo:list-item-body>
            </fo:list-item>
    </xsl:template>
 

Несколько xsl:choose ветвей используются для запроса нескольких условий; условия 2 и 3 здесь не перечислены из-за их длины, но они структурированы точно так же, как условие 1.

     <xsl:template match="//w:t">
        <xsl:choose>
            <xsl:when test="../w:rPr/w:b">
                <xsl:choose>
                    <xsl:when test="../w:rPr/w:u">
                        <xsl:choose>
                            <xsl:when test="../w:rPr/w:i">
                                <fo:inline>
                                    <xsl:attribute name="font-weight">bold</xsl:attribute>
                                    <xsl:attribute name="text-decoration">underline</xsl:attribute>
                                    <xsl:attribute name="font-style">italic</xsl:attribute>
                                    <xsl:apply-templates/>
                                </fo:inline>
                            </xsl:when>
                            <xsl:otherwise>
                                <fo:inline>
                                    <xsl:attribute name="font-weight">bold</xsl:attribute>
                                    <xsl:attribute name="text-decoration">underline</xsl:attribute>
                                    <xsl:apply-templates/>
                                </fo:inline>
                            </xsl:otherwise>
                        </xsl:choose>
                    </xsl:when>
                </xsl:choose>
            </xsl:when>
    
    ...
    
        </xsl:choose>
    </xsl:template>
 

FO-Файл, как выглядит код в файле FO:

       <fo:block>... weil 
       <fo:inline font-weight="bold">Fi</fo:inline>
       <fo:inline font-weight="bold">l</fo:inline>
       <fo:inline font-weight="bold">mmaterial</fo:inline> in ...
      </fo:block>
 

Комментарии:

1. Возможно, вы используете: <xsl:отступ вывода=»да» />. Если это так, измените это на <xsl:отступ на выходе=»нет»/>, И если ваш источник уже имеет отступ, используйте: <xsl:отступ на выходе=»нет» /><xsl:элементы пробела=»w:r»/>

2. Бинго! output indent="no" сделал это. Так просто и все же упущено из виду. Спасибо! Если вы опубликуете это в качестве ответа, я могу выбрать его.

Ответ №1:

Может быть, вы использовали: <xsl:output indent="yes" /> .

Если да, измените это на <xsl:output indent="no" />

И если ваш источник уже имеет отступ, используйте: <xsl:strip-space elements="w:r"/>