XSL:FO float 用于显示页边注释 - 破坏文档

2024-03-10

我有一份大型中世纪手稿,已转录为 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>我们需要携带数百份此类文件才能撰写完整的手稿。

我已按照以下基本说明成功地将其处理为 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>,有一个边注“Fabri +”。它被编码了<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>

我遇到了这场灾难(红色文本/箭头是我解决问题的指南)。带浮动的模板做了三件我无法理解的事情。浮动“应该”出现在第四段旁边,但位于下方,与下一个段合并<p>;第四个<seg>已经消失了;以及以下内容<p>的缩进减少了。


好吧,这不是你的答案,因为你正在使用 FOP 并且它对浮动的支持非常有限。我以你为例,对内容进行了一些扩展,并删除了一些奇怪的东西,例如像你一样设置 ID。

这个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不支持这个浮动,你应该联系他们寻求支持。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

XSL:FO float 用于显示页边注释 - 破坏文档 的相关文章

  • WPF 应用程序的最佳本地数据库解决方案是什么?

    目前适用于 WPF 应用程序的最佳解决方案是什么一台电脑 where 各种用户登录它们并使用它们在本地获取 保存信息 以下是我看到选项的方式 MDF似乎是最好的选择 因为我假设您可以很好地锁定它 这样即使用户可以访问 mdf 文件 他们仍然
  • 从 OMElement 对象获取 InputStream/io.Reader

    我有一个OMElement对象 从中我想得到一个InputStream或读者对象 我想要的是流式传输xml来自OMElement我有 没有加载到内存中 我只能得到XMLStreamReader对此表示反对 但我找不到办法得到InputStr
  • android:widgetLayout 和 android:layout 之间的区别?

    我得到一些奇怪的配置 其中 widgetLayout 配置列表项的内部空间 而布局配置整个项目列表和屏幕背景 有人能真正解释一下什么是 widgetLayout 吗 android layout 整个首选项的布局 包括标题 摘要和小部件 a
  • 为基于架构的 XML 文件创建 WPF 编辑器

    这是场景 我们的服务器产品之一使用大型 XML 配置文件 该文件的布局相当好 并且针对 XSD 文件进行了验证 现在是时候构建一个配置 GUI 来维护这个文件了 我想深入研究 WPF 来完成它 我可以为每个配置部分布置一个单独的表单 每次向
  • 在 PHP 5 中使用 Schematron 验证 XML

    我在验证 XML 时遇到问题图解器 http en wikipedia org wiki Schematron 在我的代码中 我将 XML 和 XSL 作为 DOMDocument 对象加载 并尝试进行转换 domSche new DOMD
  • 如何附加到 xml

    我有这个xml
  • 编写 XSLT 分组

    我有一个简单的 XML 其中包含两个级别 标题和行 标签 例如
  • 如何使用 SAX Java 解析器读取注释文本

    我只想使用 Java 中的 SAX 解析器读取 XML 文件中对象标记的注释 这是我的文件的摘要
  • Android 键盘清单未显示在设置中

    我正在制作我的第一个 Android 应用程序 我需要它作为键盘服务 据我所知 清单看起来不错 并且我有一个文件 WifiJoy java 在 com zwad3 wifijoy 包中 以及所有其他文件
  • 使用 JAXB 编组只能包含多种子节点类型之一的 XML 节点(SharePoint 查询)

    我正在尝试创建 JAXB 带注释的类来生成基于 Microsoft SharePoint 的 XML查询模式 http msdn microsoft com en us library ms467521 28v office 14 29 a
  • ElementTree 和 Element 有什么区别? (Python XML)

    from xml etree ElementTree import ElementTree Element SubElement dump elem Element 1 sub SubElement elem 2 tree ElementT
  • 如何使用scrapy抓取xml url

    你好 我正在使用 scrapy 来抓取 xml url 假设下面是我的 Spider py 代码 class TestSpider BaseSpider name test allowed domains www example com s
  • 使用 C# 编辑 XML 文档

    我在解决如何将元素添加到 XML 文档中时遇到了一些麻烦 我想将热点信息添加到 xml 中 其中 Id 正确 因此 id 2 添加热点信息 这是我当前的 XML
  • JAXB - 忽略元素

    有什么方法可以忽略 Jaxb 解析中的元素吗 我有一个很大的 XML 文件 如果我可以忽略其中一个大而复杂的元素 那么它的解析速度可能会快很多 如果它根本无法验证元素内容并解析文档的其余部分 即使该元素不正确 那就更好了 例如 这应该只生成
  • 具有多个应用程序标签的 AndroidManifest.xml

    我对 Android 编程非常陌生 我一直在试图找出为什么我的应用程序在单击按钮时强制关闭 我已将范围缩小到几件事 一个问题 是否可以拥有多个
  • 使用 Retrofit 2 解析 XML

    我试图从央行获取汇率 不幸的是他们没有可以提供 JSON 数据的 api 仅在 XML 中 我正在使用 Retrogit 2 我已经创建了两个类 它们描述了我从网站获得的 xml 但是当我尝试获取回调的响应时 我收到了 404 错误代码 也
  • 使用批处理解析 XML 文件以从某些特定节点获取值

    对于每个节点列表有Lists作为其父节点 我想获取 保存前三个节点的变量值 即entry output and token 我知道如何使用 vbscript 来做到这一点 但对我来说 批量解决方案更有趣 请问可以做吗
  • 如何在 xslt 2.0 中解析字符串到日期

    是否可以像这样转换字符串30042013 2013 年 4 月 30 日 日期格式 所以我可以稍后在类似的函数中使用它format date 就像托马拉克说的 你可以使用substring and concat 要构建一个字符串 您可以将其
  • 更改 Windows Phone 系统托盘颜色

    有没有办法将 Windows Phone 上的系统托盘颜色从黑色更改为白色 我的应用程序有白色背景 所以我希望系统托盘也是白色的 您可以在页面 XAML 中执行此操作
  • xsi:type 属性搞乱了 C# XML 反序列化

    我使用 XSD exe 根据 XML 架构 xsd 文件 自动生成 C 对象 我正在反序列化 OpenCover 输出 但其中一个部分类未正确生成 这是导致异常的行

随机推荐

  • 在 Perl 6 中使用正则表达式和 .contains 进行过滤

    我经常需要过滤元素array字符串 包含一些子字符串 例如一个字符 因为它可以通过匹配来完成regex或与 contains方法 我决定做一个小测试以确保 contains更快 因此更合适 my array aa cc my constan
  • 如何从应用程序内向 PowerShell 公开功能

    我正在听有关 PowerShell 2 0 的播客斯科特 汉塞尔曼所做的 http www hanselminutes com default aspx showID 180 在那一集中 他们讨论了扩展应用程序以公开 PowerShell
  • 对预先输入的建议进行排序,准确的输入位于顶部

    我使用 Twitter typeahead js 0 10 5 作为建议引擎 它工作得很好 除了一个例外 我无法按照我想要的方式对建议列表进行排序 举个例子 var data id 1 value no need id 2 value th
  • 基于Count使用IF ELSE语句执行不同的Insert语句

    当我搜索数据库时 如果发现某个特定项目不存在 我会运行 INSERT 语句 如果找到一个或多个该项目 我会运行不同的 INSERT 语句 我不完全确定如何使用 IF ELSE 表达式 到目前为止 我有一个语句 它将计算目标数据出现的次数 如
  • 当数据库中缺少项目时,PHP 或 htaccess 使动态 url 页面转到 404

    典型场景 DB项目显示在页面中http item id 467 用户一天deletes该项目 谷歌或用户 尝试访问http item id 467 PHP 挖掘数据库并发现项目不再存在 所以现在 PHP 必须告诉 通过 404 标头和页面
  • 如何防止 CompileAssemblyFromSource 泄漏内存?

    我有一些 C 代码 它使用 CSharpCodeProvider CompileAssemblyFromSource 在内存中创建程序集 程序集被垃圾收集后 我的应用程序使用的内存比创建程序集之前更多 我的代码位于 ASP NET Web
  • Play Framework 2.4 Writes[-A] 与 OWrites[-A]、Format[A] 与 OFormat[A]。目的?

    PlayFramework Json 库中的 Writes A 和 OWrites A 有什么区别 我使用过 Writes A 但我不明白 OWrites 的用途是什么 同样的问题也适用于 Format A 与 OFormat A 源码可以
  • 如何在 Jasmine 测试中测试 $scope.$on 事件?

    我正在对控制器进行单元测试 并且想测试事件处理程序 假设我的控制器看起来像 myModule controller MasterController scope function scope scope on locationChangeS
  • 如何捕获无线路由器的原始信号?

    我现在看到了几个项目 它们从典型无线路由器收集的无线电数据中获取新颖的空间信息 http wisee cs washington edu http wisee cs washington edu http www extremetech c
  • HERE SDK 在 Android 8 上无法在后台使用

    HERE SDK 尝试启动它的MapService当消费者致电时内部MapEngine init 由于 Android 8 后台执行限制 如果出现以下情况 则会失败MapEngine将从后台服务初始化 有什么办法可以初始化吗MapEngin
  • Python安装libs文件夹中的python3.lib和python3x.lib有什么区别?

    我一直在编译 C 库 并链接 Python3 库文件以进行 Python 绑定 我一直使用 python39 lib 文件作为链接 但我想知道 版本化 数字 例如 python3x lib 与非版本化数字 python3 lib 之间有什么
  • Chrome 85 Service Worker 一直在尝试安装

    在我的 Web 应用程序上更新 chrome 85 后 Service Worker 不再安装 它在 chrome 84 或更早版本 Safari Firefox Microsoft Edge 浏览器上运行良好 尝试查找更改日志或错误报告
  • vue vite动态组件导入

    我正在将现有的 laravel ineria 从 mix 迁移到 vit 我完成了迁移指南中的所有步骤 除了一件事之外 一切正常 我有一个组件接收一个包含组件数组的道具 我曾经这样要求它们 在循环内 this options compone
  • BSD md5 与 GNU md5sum 输出格式?

    任何人都知道为什么 BSD md5 程序会产生这种格式的哈希输出 MD5 checksum md5 9eb7a54d24dbf6a2eb9f7ce7a1853cd0 而 GNU md5sum 会产生像这样更合理的格式 9eb7a54d24d
  • iOS 图表 - 单个值不显示 Swift

    当我在折线图上的一条线的数组中有多个点时 一切都会完美显示 但当只有一个点时 该点就不会显示 我不知道为什么 代表被设置在其他地方 但这似乎不是问题 以下示例显示了测试 2 和测试练习 第一个图像中每个图像都有一个值 第二个图像中每个图像都
  • 如何获取给定一天的本周的所有日期时间实例?

    给定一天 我想获取该天所在星期的所有天 日期时间实例 我有一个解决方案 如果有问题请纠正我是否存在更有效的方法 gt gt gt import datetime gt gt gt today datetime datetime 2013 0
  • Spring Boot 处理 SizeLimitExceededException

    我使用 Spring boot 1 5 7 我还没有配置 CommonsMultipartResolver 因为 Spring Boot 已经处理文件上传了 如果我的上传超过允许的最大大小 则会抛出一个丑陋的异常 这是由我的控制器处理的 C
  • Makefile :自动编译所有c文件,将.o文件保存在单独的文件夹中

    我所拥有的是一个包含 3 个子目录的目录 src 用于 c 和 h 文件 bin 是编译后的可执行文件应该存放的位置 obj 是我希望 obj 文件存放的位置 现在我希望 makefile 编译 src 中的每个 c 文件 无需将它们全部列
  • 我怎样才能用python挤出一个stl

    我正在尝试转换png图像转 3Dstls 我终于找到了一种方法来做到这一点 但有一个问题 现在导出的图像没有 z 值 也没有厚度 我这样做的方式是针对图像上的白色像素 将三角形绘制到表面上 def define faces numpy ar
  • XSL:FO float 用于显示页边注释 - 破坏文档

    我有一份大型中世纪手稿 已转录为 XML 使用 TEI 模式 我正在使用 xsl fo 和 Apache FOP 处理 PDF 该文件是使用嵌套构造的 p p