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>
Отступ уменьшается.
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, вы должны связаться с ними для поддержки.