XSL-FO 高级技术5

概述 第 1 页(共6 页)


先让我们看一下链接在 XSL-FO 中是如何工作的。本章讨论下列主题:

  • 创建锚点
  • 创建交叉引用
  • 创建 Web 链接
锚点 第 2 页(共6 页)


创建锚点相当简单;只需将 id 属性添加到 XSL-FO 元素。几乎可以将该属性添加到任何格式化对象。下面是 idlcr 的文档标题:


<fo:block id="lcr" font-size="18pt" line-height="21pt"
  font-weight="bold">
  Links and cross-references
</fo:block>

该标识在 XSL-FO 文件中创建名为 lcr 的锚点。如果 XSL-FO 文件包含另一个 idlcr 的元素,将得到一个错误。


交叉引用 第 3 页(共6 页)


一旦创建了锚点,就可以创建对它的引用。引用类似于:


<fo:block>
  For more information, see <fo:basic-link color="blue" 
  internal-destination="lcr">Links and 
  cross-references</fo:basic-link>.
</fo:block>

在 PDF 文件中,单词 Links and cross-references 显示为兰色,如果用户单击这些单词,他们将查看文档中的 Links and cross-references 一节。

该链接工作得很好,但如何生成链接文本呢?要从 XML 源文档生成链接,使用 XSLT 的 key() 函数。假设 XML 源代码类似于:


<h1 id="lcr">
  Links and cross-references
</h1>
  ...
<p>
  For more information, see <xref refid="lcr"/>.
</p>

请注意:这里的 <xref> 元素不包含被引用标题的文本。这很重要;如果文档中那一节的标题更改了,您不需要遍历整个文档搜索所有对它的引用。现在您只需要找到 idlcr 的元素文本。下面是处理 <xref> 元素的 XSLT 模板:


<xsl:template match="xref">
  <fo:basic-link color="blue"
      internal-destination="{@refid}">
    <xsl:value-of select="key('headings', @refid)"/>
  </fo:basic-link>
</xsl:template>

这里的 key() 函数的工作原理类似于数据库索引;您让 XSLT 处理器来查找名为 headings 的索引,并查找 id 等于 <xref> 元素中 refid 属性的元素。<xsl:value-of> 元素插入该元素的值,它是标题文本。(这里,我不会深入讨论 key() 函数;您可以在 developerWorks XML 专区找到有关 XSLT 的大量信息;请参考参考资料,以获取一些建议。)


页号引用 第 4 页(共6 页)


那么现在,您已经知道如何创建基本的交叉引用,但交叉引用仅在联机状态下工作。有许多 PDF 文档用户会将它们打印出来,然后脱机阅读它们。如何创建可以帮助他们的交叉引用呢?如果他们没有快速简便的方法来查找 XYZ,则告诉他们“For more information, see XYZ”是没有任何帮助的。在传统打印文档中,除了被引用章节的标题外,还用页号引用来完成好的交叉引用。

幸运的是,XSL-FO 为页号引用定义了一个元素。页号引用类似于:


<fo:page-number-citation ref-id="lcr"/>

当 FOP 处理该元素时,<fo:page-number-citation> 元素被 idlcr 的格式化对象的页号替换。要知道:现在该特性的 FOP 实现中仍有一些错误;虽然页号将是正确的,但 FOP 很少会在页面上留下足够空间来显示页号。


 


Web 引用 第 5 页(共6 页)


最后,让我们看一下如何创建 Web 引用。这里的主要差异是您正在链接的内容不是 PDF 文件的一部分。XSL-FO 为此定义了 <fo:basic-link> 元素的 external-destination 特性。对 developerWorks 网站的 XSL-FO 引用类似于:


<fo:block>
  For all the technical information you'd ever want, visit
  <fo:basic-link color="blue" 
    external-destination="http://www.ibm.com/developerWorks/">
    developerWorks
  </fo:basic-link>
  and prepare to be amazed!
</fo:block>

当开始设计 XML 源文档时,必须解决如何格式化 Web 引用这一关键设计问题。如果用户在线查看链接,那么他们只要单击它,就可转至 developerWorks 站点。如果读者在 PDF 文档的印刷版本中遇到链接时,他们如何知道链接到哪里呢?请考虑与下面类似的 XML 元素:


<p>
  For all the technical information you'd ever want, visit
  <a href="http://www.ibm.com/developerWorks/">
    developerWorks</a> and prepare to be amazed!
</p>

您可能要按如下将引用格式化:


<fo:block>
  For all the technical information you'd ever want, visit
  <fo:basic-link color="blue" 
    external-destination="http://www.ibm.com/developerWorks/">
    developerWorks (http://www.ibm.com/developerWorks/)
  </fo:basic-link>
  and prepare to be amazed!
</fo:block>

该编码向在线用户提供了一个可点击的链接,同时如果打印文档的用户要查看被引用站点上内容的话,也为他们提供了可以输入到浏览器中的 Web 地址。另一方面,如果 URL 值的长度超过 150 个字符,那么打印该 URL 是无用的;当然,如何实现它的决定取决于您。

链接和交叉引用示例 第 6 页(共6 页)


结束本章时,您可能想学习完整的示例文件和产生的 PDF 文件。格式化对象文件 包括本章中讨论的所有链接类型。您可以进行查看 以了解输出。下面是部分抓屏:

links.pdf 样本文件的抓屏

在该示例中,页号引用被正确格式化,但这只是因为我在 XSL-FO 文件中手工插入了额外的空格。原始标记类似于:


<fo:block font-size="14pt" line-height="17pt"
  space-after="14pt"
  start-indent="3cm" end-indent="3cm">
  For ice cream statistics, see 
  <fo:basic-link color="blue" internal-destination="flavors">
    Ice Cream Sales 3Q 2002
  </fo:basic-link>
  on page 
  <fo:page-number-citation color="blue" ref-id="flavors"/>
  .
</fo:block>

<fo:page-number-citation> 元素的两边没有额外的换行,文本就不会被正确格式化。更糟的是,如果被引用的页号超过一位或两位数字,那么页号会覆盖句子末尾的句号。我希望 FOP 的未来版本会修正这一小问题。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值