首页
|
新闻
|
新品
|
文库
|
方案
|
视频
|
下载
|
商城
|
开发板
|
数据中心
|
座谈新版
|
培训
|
工具
|
博客
|
论坛
|
百科
|
GEC
|
活动
|
主题月
|
电子展
注册
登录
论坛
博客
搜索
帮助
导航
默认风格
uchome
discuz6
GreenM
»
MCU 单片机技术
»
X86
» HTML 至格式化对象(FO)转换指南(9)命名锚点引用
返回列表
回复
发帖
发新话题
发布投票
发布悬赏
发布辩论
发布活动
发布视频
发布商品
HTML 至格式化对象(FO)转换指南(9)命名锚点引用
发短消息
加为好友
look_w
当前离线
UID
1066743
帖子
8283
精华
0
积分
4142
阅读权限
90
在线时间
233 小时
注册时间
2017-6-23
最后登录
2019-5-18
论坛元老
UID
1066743
1
#
打印
字体大小:
t
T
look_w
发表于 2018-7-15 08:37
|
只看该作者
HTML 至格式化对象(FO)转换指南(9)命名锚点引用
<sup> 上标文本正如下标文本一样,可使用 XSL-FO vertical-align 属性来处理上标文本。以下是一个 HTML 样本:
1
2
<p>Einstein's famous e=mc<sup>2</sup>
is an equation that changed the world. </p>
以下是我们的 XSLT 模板:
1
2
3
4
5
6
7
8
<xsl:template match="sup">
<fo:inline
vertical-align="super"
font-size="75%">
<xsl:apply-templates select="*|text()"/>
</fo:inline>
</xsl:template>
<table> 表标记要处理 HTML <table> 元素,最大的难题是确定 XSL-FO 表应该有多少列,以及这些列的宽度。FOP 要求为表中的每一列提供一个 <fo:table-column> 元素。一旦处理完这些列,就只需调用表中所有元素的 XSLT 模板。这一 XSLT 模板处理类似于这样的 cols :
1
<table cols="200 100pt" border="1">
需要将 cols 属性转换成以下标记:
1
2
<fo:table-column column-width="200pt"/>
<fo:table-column column-width="100pt"/>
要实现这一转换,需要使用常用的被称为
尾递归(tail recursion)
的 XSLT 技术。创建这样一个指定的模板:它使用属性值的首个单词,将其转换成 <fo:table-column> 元素,然后调用自身以处理属性值的余下部分。最终,处理整个属性。下面来看这个 XSLT 模板是如何处理 <table> 元素的:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<xsl:template match="table">
<fo:table
table-layout="fixed">
<xsl:choose>
<xsl:when test="@cols">
<xsl:call-template name="build-columns">
<xsl:with-param name="cols"
select="concat(@cols, ' ')"/>
</xsl:call-template>
</xsl:when>
<xsl
therwise>
<fo:table-column column-width="200pt"/>
</xsl
therwise>
</xsl:choose>
<fo:table-body>
<xsl:apply-templates select="*"/>
</fo:table-body>
</fo:table>
</xsl:template>
如果有 cols 属性,则处理器调用 build-columns 模板;否则它创建一个 <fo:table-column> 元素。另请注意: <fo:table> 元素有属性 table-layout="fixed" ;目前,如果没有该属性,FOP 会发出一条警告消息。
让我们研究一下 build-columns 模板:
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
<xsl:template
name="build-columns">
<xsl:param name="cols"/>
<xsl:if test="string-length(normalize-space($cols))">
<xsl:variable name="next-col">
<xsl:value-of select="substring-before($cols, ' ')"/>
</xsl:variable>
<xsl:variable name="remaining-cols">
<xsl:value-of select="substring-after($cols, ' ')"/>
</xsl:variable>
<xsl:choose>
<xsl:when test="contains($next-col, 'pt')">
<fo:table-column column-width="{$next-col}"/>
</xsl:when>
<xsl:when test="number($next-col) > 0">
<fo:table-column column-width="{concat($next-col, 'pt')}"/>
</xsl:when>
<xsl
therwise>
<fo:table-column column-width="50pt"/>
</xsl
therwise>
</xsl:choose>
<xsl:call-template name="build-columns">
<xsl:with-param name="cols" select="concat($remaining-cols, ' ')"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
首先,模板在除去所有首尾处的空白(这是 XSLT normalize-space() 函数所做的工作)之后检查 $cols 参数的长度。接下来,它将 $cols 值分为两部分:第一个空格
之前
的子串,和
之后
的所有内容。(注:当处理器从 <table> 元素的模板调用该模板时,它将一个空格添加到值的末尾,因此始终至少有一个空格。)
既然 $cols 参数被分为两部分,则首先处理第一部分:
如果值包含字符串 pt ,则假定它是一个类似 200pt 的值,并且生成带该值的 <fo:table-column> 元素。
如果值是数字,则将字符串 pt 添加到它的末尾,然后生成 <fo:table-column> 元素。使用 XSLT number() 函数将该值转换成数字。如果值不是数字(譬如,假设它是 number(xyz) ),则函数返回字符串 NaN (表示不是数字)。
如果以上两条规则都不适用,则仅创建 column-width 为 50pt 的新 <fo:table-column> 元素。
在处理器处理完 $cols 参数的第一部分之后,这个指定的模板用 $cols 参数的最后部分调用自己,并在值的末尾添加一个空格以确保存在空格。
收藏
分享
评分
回复
引用
订阅
TOP
返回列表
电商论坛
Pine A64
资料下载
方案分享
FAQ
行业应用
消费电子
便携式设备
医疗电子
汽车电子
工业控制
热门技术
智能可穿戴
3D打印
智能家居
综合设计
示波器技术
存储器
电子制造
计算机和外设
软件开发
分立器件
传感器技术
无源元件
资料共享
PCB综合技术
综合技术交流
EDA
MCU 单片机技术
ST MCU
Freescale MCU
NXP MCU
新唐 MCU
MIPS
X86
ARM
PowerPC
DSP技术
嵌入式技术
FPGA/CPLD可编程逻辑
模拟电路
数字电路
富士通半导体FRAM 铁电存储器“免费样片”使用心得
电源与功率管理
LED技术
测试测量
通信技术
3G
无线技术
微波在线
综合交流区
职场驿站
活动专区
在线座谈交流区
紧缺人才培训课程交流区
意见和建议