XSL:FO с плавающей точкой для отображения примечаний к полям - разбивает документ

У меня есть большая средневековая рукопись, транскрибированная в XML (с использованием схемы TEI). Я использую xsl:fo и Apache FOP для обработки в PDF. Файл построен с использованием вложенных <body>, <p>, <seg> как показано ниже. Время от времени <add> используется для заметок на полях.

<body>
   <p>
    <title>title here</title>
    <seg>Lorem ipsum dolor sit amet, consectetur adipiscing elit. 
        Quisque a orci non mauris convallis imperdiet consequat nec 
        purus. Cras mollis lacus vel lectus facilisis, non
        hendrerit velit tempor. Phasellus tempor urna vel accumsan 
        dignissim.</seg>
    <seg>Aliquam porta eu nunc sed laoreet. 
        Sed<add type='margin_gloss'>Some margin note here</add> 
        non nulla consectetur, lobortis tortor ac,
        placerat nunc. Nulla viverra finibus est nec efficitur. Donec 
        nisi nisl, tincidunt dapibus purus pretium, rhoncus volutpat 
        tortor. Cras fringilla tellus tortor, at
        ultricies mi cursus at. Nulla facilisi.</seg>
    <seg>Quisque id mi nisl. In in mauris id leo malesuada hendrerit. 
        Orci varius natoque
        penatibus et magnis dis parturient montes, nascetur ridiculus 
        mus. Nulla sit amet
        commodo mauris.</seg>
  </p>
</body>

XML-файл является массовым, поэтому существует один главный XML-файл, который использует <xi:include>s, чтобы принести сотни этих документов, чтобы составить полную рукопись.

Я успешно обработал это в PDF со следующими основными инструкциями:

  <xsl:template match="/">
      <fo:root>
         <fo:layout-master-set>
             <fo:simple-page-master 
                master-name="page-recto"
                page-height="29.7cm"  page-width="21cm"
                margin-top="2cm" margin-bottom="2cm" 
                margin-left="2cm" margin-right="1cm">
                <fo:region-body 
                    region-name="xsl-region-body"/>
             </fo:simple-page-master>
         </fo:layout-master-set>

        <fo:page-sequence master-reference="page-recto">
            <fo:flow flow-name="xsl-region-body" 
                font-family="Times" font-weight="normal" 
                font-size="8pt" space-before="8pt" space-after="8pt"
                text-align="justify" end-indent="120pt">
                <xsl:apply-templates/>
            </fo:flow>
        </fo:page-sequence>

     </fo:root>
   </xsl:template>

   <xsl:template match="body/p">
     <fo:block 
         page-break-inside="avoid"
         font-size="9pt" font-weight="bold" 
         padding-bottom="1cm" end-indent="120pt">
         <xsl:value-of select="tei:title"/>
         <xsl:apply-templates/>
     </fo:block>
   </xsl:template>


   <xsl:template match="seg">
      <fo:block id="@xml:id"
          font-family="Times" font-weight="normal"
         font-size="8pt" space-before="8pt"
         space-after="8pt" text-align="justify"
         end-indent="120pt">
             <xsl:apply-templates/>
      </fo:block>
    </xsl:template>

Это дает мне успешный результат, как эта страница:

Удачный образец

Я выделил правую сторону (конец), чтобы освободить место для заметок на полях. Например, в 4-м <seg> из первых <p>, есть отметка на полях "Фабри +". Это закодировано <add type=margin_gloss>Fabri +</add>

Я добавляю следующий шаблон, чтобы "плавать" глянец поля:

<xsl:template match="body/p//add[@type='margin_gloss']">
     <fo:float float="end">
            <fo:block-container>
                <fo:block>
                    <xsl:value-of select="./s/text()"/>
                </fo:block>
            </fo:block-container>
        </fo:float>

</xsl:template>

И я получаю эту катастрофу (красный текст / стрелки - мои ориентиры по проблемам). Шаблон с плавающей точкой сделал 3 вещи, которые я не могу понять. Поплавок "должен" появиться рядом с 4-м сегментом, но вместо этого находится ниже, объединенный со следующим <p>; 4-й <seg> исчез; и следующее <p>Отступ уменьшается.

3 бедствия с одним шаблоном

1 ответ

Решение

Ну, это не ответ для вас, потому что вы используете FOP, и у него очень ограниченная поддержка float. Я взял вам пример, немного расширил его содержанием и удалил некоторые странные вещи, такие как установка идентификатора, как вы это сделали.

Этот XML:

<body>
<p>
    <title>title here</title>
    <seg>1 Lorem ipsum dolor sit amet, consectetur adipiscing elit. 
        Quisque a orci non mauris convallis imperdiet consequat nec 
        purus. Cras mollis lacus vel lectus facilisis, non
        hendrerit velit tempor. Phasellus tempor urna vel accumsan 
        dignissim.</seg>
    <seg>2 note Aliquam porta eu nunc sed laoreet. 
        Sed<add type='margin_gloss'>Some margin note here</add> 
        non nulla consectetur, lobortis tortor ac,
        placerat nunc. Nulla viverra finibus est nec efficitur. Donec 
        nisi nisl, tincidunt dapibus purus pretium, rhoncus volutpat 
        tortor. Cras fringilla tellus tortor, at
        ultricies mi cursus at. Nulla facilisi.</seg>
    <seg>3 Quisque id mi nisl. In in mauris id leo malesuada hendrerit. 
        Orci varius natoque
        penatibus et magnis dis parturient montes, nascetur ridiculus 
        mus. Nulla sit amet
        commodo mauris.</seg>
    <seg>4 Quisque id mi nisl. In in mauris id leo malesuada hendrerit. 
        Orci varius natoque
        penatibus et magnis dis parturient montes, nascetur ridiculus 
        mus. Nulla sit amet
        commodo mauris.</seg>
    <seg>5 Quisque id mi nisl. In in mauris id leo malesuada hendrerit. 
        Orci varius natoque
        penatibus et magnis dis parturient montes, nascetur ridiculus 
        mus. Nulla sit amet
        commodo mauris.</seg>
    <seg>6 note Aliquam porta eu nunc sed laoreet. 
        Sed<add type='margin_gloss'>Some margin note here 2</add> 
        non nulla consectetur, lobortis tortor ac,
        placerat nunc. Nulla viverra finibus est nec efficitur. Donec 
        nisi nisl, tincidunt dapibus purus pretium, rhoncus volutpat 
        tortor. Cras fringilla tellus tortor, at
        ultricies mi cursus at. Nulla facilisi.</seg>
    <seg>7 Quisque id mi nisl. In in mauris id leo malesuada hendrerit. 
        Orci varius natoque
        penatibus et magnis dis parturient montes, nascetur ridiculus 
        mus. Nulla sit amet
        commodo mauris.</seg>
    <seg>8 Quisque id mi nisl. In in mauris id leo malesuada hendrerit. 
        Orci varius natoque
        penatibus et magnis dis parturient montes, nascetur ridiculus 
        mus. Nulla sit amet
        commodo mauris.</seg>
</p>
</body>

Обработано с помощью этого XSL:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" 
version="1.0">
<xsl:template match="/">
    <fo:root>
        <fo:layout-master-set>
            <fo:simple-page-master 
                master-name="page-recto"
                page-height="29.7cm"  page-width="21cm"
                margin-top="2cm" margin-bottom="2cm" 
                margin-left="2cm" margin-right="1cm">
                <fo:region-body 
                    region-name="xsl-region-body"/>
            </fo:simple-page-master>
        </fo:layout-master-set>

        <fo:page-sequence master-reference="page-recto">
            <fo:flow flow-name="xsl-region-body" 
                font-family="Times" font-weight="normal" 
                font-size="8pt" space-before="8pt" space-after="8pt"
                text-align="justify" end-indent="120pt">
                <xsl:apply-templates/>
            </fo:flow>
        </fo:page-sequence>

    </fo:root>
</xsl:template>

<xsl:template match="body/p">
    <fo:block 
        page-break-inside="avoid"
        font-size="9pt" font-weight="bold" 
        padding-bottom="1cm" end-indent="120pt">
        <xsl:value-of select="title"/>
        <xsl:apply-templates/>
    </fo:block>
</xsl:template>

<xsl:template match="add">
    <fo:inline font-style="italic">
        <xsl:apply-templates/>
    </fo:inline>
</xsl:template>

<xsl:template match="seg">
    <fo:block
        font-family="Times" font-weight="normal"
        font-size="8pt" space-before="8pt"
        space-after="8pt" text-align="justify"
        end-indent="2.5in">
        <xsl:if test="descendant::add[@type='margin_gloss']">
            <fo:float float="right">
                <fo:block-container width="2in" border="1pt solid black" margin="10pt">
                    <fo:block>
                        <xsl:apply-templates select="add[@type='margin_gloss']"/>
                    </fo:block>
                </fo:block-container>
            </fo:float>
        </xsl:if>
        <xsl:apply-templates select="text()"/>
    </fo:block>
</xsl:template>
</xsl:stylesheet>

Результаты в этом PDF при использовании RenderX XEP с отображением ваших плавающих заметок. Если я использую Apache FOP 2.1, они полностью отсутствуют, так же как и абзацы с плавающей точкой в ​​них. Это полностью указывает мне на то, что FOP не поддерживает этот float, вы должны связаться с ними для поддержки.

Другие вопросы по тегам