HTML 至格式化对象(FO)转换指南(3)命名锚点引用
- UID
- 1066743
|
HTML 至格式化对象(FO)转换指南(3)命名锚点引用
要转换引用同一文档中另一目标的锚点标记,可将其转换成 <fo:basic-link> 元素。对于对同一文档的引用,可使用 internal-destination 属性。例如,假定有如下所示的锚点元素:
1
| For more information, see <a href="#chapter1">Chapter 1</a>.
|
需要将该锚点元素转换成以下 XSL-FO 标记:
1
2
3
4
| For more information, see
<fo:basic-link color="blue" internal-destination="chapter1">
Chapter 1
</fo:basic-link>.
|
如果 HTML 锚点元素有 href 属性,则查看该属性是否以井号( # )开头。如果是的话,则可将 href 属性用作 <fo:basic-link> 的 internal-destination 。为使用该值,则必须除去井号:使用 XSLT substring() 函数。处理内部链接要做的最后一件事是将 <fo:page-number-citation> 添加到要引用的部分。
进行这一转换的 XSLT 模板可能类似于这样:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
| <xsl:template match="a">
<xsl:choose>
<xsl:when test="@name">
... The previous entry covered named anchors ...
</xsl:when>
<xsl:when test="@href">
<fo:basic-link color="blue">
<xsl:choose>
<xsl:when test="starts-with(@href, '#')">
<xsl:attribute name="internal-destination">
<xsl:value-of select="substring(@href, 2)"/>
</xsl:attribute>
</xsl:when>
<xsltherwise>
... Handle external links here ...
</xsltherwise>
</xsl:choose>
<xsl:apply-templates select="*|text()"/>
</fo:basic-link>
<xsl:if test="starts-with(@href, '#')">
<xsl:text> on page </xsl:text>
<fo:page-number-citation ref-id="{substring(@href, 2)}"/>
</xsl:if>
</xsl:when>
</xsl:choose>
</xsl:template>
|
<fo:page-number-citation> 元素意味着所表示的链接类似于这样:
1
| For more information, see Chapter 1 on page 73.
|
<a href="#..."> 锚点引用本指南中讨论的最后一种链接是对 URI 的引用。要在本教程的示例 PDF 文件中表示这些链接,可使用 <fo:basic-link> 的 external-destination 属性。例如,假定有如下所示的锚点元素:
1
2
3
| <a href="http://www.ibm.com/developerworks/">
IBM's developerWorks Web site
</a>
|
您可以将该元素转换成以下标记:
1
2
3
4
| <fo:basic-link color="blue"
external-destination="http://www.ibm.com/developerworks/">
IBM's developerWorks Web site
</fo:basic-link>
|
以下是用于这三种锚点元素的完整的 XSLT 模板:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
| <xsl:template match="a">
<xsl:choose>
<xsl:when test="@name">
<xsl:if test="not(name(following-sibling::*[1]) = 'h1')">
<fo:block line-height="0" space-after="0pt"
font-size="0pt" id="{@name}"/>
</xsl:if>
</xsl:when>
<xsl:when test="@href">
<fo:basic-link color="blue">
<xsl:choose>
<xsl:when test="starts-with(@href, '#')">
<xsl:attribute name="internal-destination">
<xsl:value-of select="substring(@href, 2)"/>
</xsl:attribute>
</xsl:when>
<xsltherwise>
<xsl:attribute name="external-destination">
<xsl:value-of select="@href"/>
</xsl:attribute>
</xsltherwise>
</xsl:choose>
<xsl:apply-templates select="*|text()"/>
</fo:basic-link>
<xsl:if test="starts-with(@href, '#')">
<xsl:text> on page </xsl:text>
<fo:page-number-citation ref-id="{substring(@href, 2)}"/>
</xsl:if>
</xsl:when>
</xsl:choose>
</xsl:template>
|
<address> 地址我们很少用到这个 HTML 元素,它可以定义地址,尽管在 <address> 元素中没有标识出通常地址中的各组成部分(电话号码、电子邮件地址、街道地址和城市等)。通常按如下方式使用 <address> 元素:
1
2
3
4
5
6
7
| <address>
Mrs. Mary Backstayge
<br />
283 First Avenue
<br />
Skunk Haven, MA 02718
</address>
|
注:该示例在 <address> 中用 <br> 元素标明换行。以下是相对应的 XSL-FO 标记:
1
2
3
| <fo:block>Mrs. Mary Backstayge<fo:block> </fo:block>
283 First Avenue<fo:block> </fo:block>
Skunk Haven, MA 02718</fo:block>
|
<address> 的 XSLT 模板十分简单;只是将 <address> 元素转换成 <fo:block> 元素,然后处理其中的文本和任何其它元素。以下是模板:
1
2
3
4
5
| <xsl:template match="address">
<fo:block>
<xsl:apply-templates select="*|text()"/>
</fo:block>
</xsl:template>
|
<b> 粗体字文本转换粗体字元素十分简单;只需将它转换为带有属性为 font-weight="bold" 的 <fo:inline> 元素。以下是示例:
1
| <p>Jackdaws <b>love</b> my big sphinx of quartz.</p>
|
使用 <fo:block> 和 <fo:inline> 这些基本的 XSL-FO 元素来显示该内容:
1
2
3
4
| <fo:block>
Jackdaws <fo:inline font-weight="bold">love</fo:inline>
my big sphinx of quartz.
</fo:block>
|
请记住下面的 XSL-FO 基本知识: <fo:block> 元素总会导致换行,而 <fo:inline> 元素则不会。由于这个原因,所以使用 <fo:inline> 来处理 <b> 元素的内容。下面这个简单的 XSLT 模板可以完成这项工作:
1
2
3
4
5
6
7
| <xsl:template match="b">
<fo:inline
font-weight="bold">
<xsl:apply-templates select="*|text()"/>
</fo:inline>
</xsl:template>
|
注: <xsl:apply-templates> 元素的 select 属性选择 <b> 元素的文本以及其可能包含的任何子元素。例如,如果上面的标记是 <p>Jackdaws <b><i>love</i></b> ... ,选择 <b> 的任何子元素可以确保粗体字和斜体字元素都能得到处理。
<big> 较大的文本极少使用的 <big> HTML 元素使得被其括起的文本比旁边的文本稍大一些。以下是示例:
1
| <p>Jackdaws <big>love</big> my big sphinx of quartz. </p>
|
这个转换比较简单,因为在 XSL-FO 教程示例中用作 FO 处理器的 FOP 工具现在支持以百分比作为 font-size 属性的值。(情况并非总是如此。)表示 <big> 元素较合理的方式是采用 120% 的 font-size :
1
2
3
4
5
6
7
| <xsl:template match="big">
<fo:inline
font-size="120%">
<xsl:apply-templates select="*|text()"/>
</fo:inline>
</xsl:template>
|
使用相对字体大小意味着多个相互嵌套的 <big> 元素使得通过这种转换所表示的文本逐渐变大,就象 HTML 中嵌套的 <big> 元素所产生的效果一样。例如,上面这段示例中,所生成的格式化对象类似于这样:
1
2
3
| <fo:block>Jackdaws
<fo:inline font-size="120%">love</fo:inline> my big
sphinx of quartz. </fo:block>
|
当然,您可以修改这个示例模板以按照您的方式处理 <big> 元素;您甚至可以使字体更大,更改颜色,诸如此类。
<blockquote> 块引用为了处理块引用,本示例将它表示为左右两边各有 1.5 厘米缩进且保持一倍行距的段。要做到这一点,可使用 <fo:block> 元素的 start-indent 和 end-indent 属性。以下是 <blockquote> 元素:
1
2
3
4
5
6
7
8
| <blockquote>
When in the Course of human events, it becomes necessary for one people
to dissolve the political bands which have connected them with another,
and to assume among the powers of the earth, the separate and equal
station to which the Laws of Nature and of Nature's God entitle them,
a decent respect to the opinions of mankind requires that they should
declare the causes which impel them to the separation.
</blockquote>
|
要将这段摘录格式化为两边缩进的段,可使用以下 XSL-FO 标记:
1
2
3
4
5
| <fo:block start-indent="1.5cm" end-indent="1.5cm">
When in the Course of human events, it becomes necessary for one people
to dissolve the political bands which have connected them with another,
...
</fo:block>
|
使用以下模板来转换 <blockquote> 元素:
1
2
3
4
5
6
7
| <xsl:template match="blockquote">
<fo:block
start-indent="1.5cm" end-indent="1.5cm">
<xsl:apply-templates select="*|text()"/>
</fo:block>
</xsl:template>
|
当然,您可以通过更改缩进属性值来修改该引用的布局。 |
|
|
|
|
|