我应该采取哪些步骤在 docbook xml 文件中创建一个占位符,该文件将在生成的 HTML 输出中使用字体真棒字体。寻找在从 DocBook 生成的 HTML 输出中使用字体真棒字体的 xslt 示例。
1 回答
希望这个答案不是tl;博士。如果您希望我将其分解为 3 个单独的答案,请告诉我。
选项1
第一个选项是在实体声明中使用 HTML 标记,就像我在评论中第一次提到的那样。
优点
- XSLT 1.0 对文档样式表的 XSLT 更改极少
缺点
i
html 元素无效,因此您的文档中会出现验证错误- 感觉就像一个黑客
你需要做什么:
将您的实体声明更改为如下所示:
<!ENTITY fa-birthday-cake "<i class='fa fa-birthday-cake' xmlns=''></i>">
这与我在第一条评论中的内容略有不同。我添加了一个空命名空间,以便该
i
元素不会自动位于默认命名空间中。将链接添加到
head
. (我把它指向本地的字体真棒。)<link rel="stylesheet" href="font-awesome-4.3.0/css/font-awesome.min.css"/>
为了测试我修改了
frameworks/docbook/xsl/html/profile-docbook.xsl
. 我在模板中添加了link
大约 460 行。match="*" mode="process.root"
添加模板以匹配
i
元素,使其不会被替换。<xsl:template match="i"> <xsl:copy-of select="."/> </xsl:template>
例子...
文档输入
<!DOCTYPE section [
<!ENTITY fa-birthday-cake "<i class='fa fa-birthday-cake' xmlns=''></i>">
]>
<section xmlns="http://docbook.org/ns/docbook" version="5.0">
<title>Section Template Title</title>
<para>birthday cake: &fa-birthday-cake;</para>
</section>
HTML 输出(使用 DocBook HTML 转换场景)
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<link rel="stylesheet" href="font-awesome-4.3.0/css/font-awesome.min.css">
<title>Section Template Title</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<div class="section">
<div class="titlepage">
<div>
<div>
<h2 class="title" style="clear: both">
<a name="d56e3"></a>Section Template Title</h2>
</div>
</div>
<div></div>
<hr>
</div>
<p>birthday cake: <i class='fa fa-birthday-cake'></i></p>
</div>
</body>
</html>
渲染 HTML
选项 2
第二种选择是在实体声明中使用 font awesome 类,并使用symbol
具有特殊role
属性的元素来保存引用。
优点
- XSLT 1.0 对文档样式表的 XSLT 更改极少
symbol
是一个 DocBook 元素,所以你不应该有验证问题
缺点
symbol
可能并非在您需要使用字体真棒图标的所有地方都可用- 感觉就像一个 hacky 使用
symbol
(可能不像第一个选项那样 hacky)
你需要做什么:
将您的实体声明更改为如下所示:
<!ENTITY fa-birthday-cake "fa-birthday-cake">
将链接添加到
head
. (我把它指向本地的字体真棒。)<link rel="stylesheet" href="font-awesome-4.3.0/css/font-awesome.min.css"/>
为了测试我修改了
frameworks/docbook/xsl/html/profile-docbook.xsl
. 我在模板中添加了link
大约 460 行。match="*" mode="process.root"
添加模板以匹配
symbol
元素与 'fa'role
并输出i
. (d
绑定到http://docbook.org/ns/docbook
profile-docbook.xsl 中的命名空间)<xsl:template match="d:symbol[@role='fa']"> <i class="fa {.}"></i> </xsl:template>
例子...
文档输入
<!DOCTYPE section [
<!ENTITY fa-birthday-cake "fa-birthday-cake">
]>
<section xmlns="http://docbook.org/ns/docbook" version="5.0">
<title>Section Template Title</title>
<para>birthday cake: <symbol role="fa">&fa-birthday-cake;</symbol></para>
</section>
HTML 输出(使用 DocBook HTML 转换场景)
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<link rel="stylesheet" href="font-awesome-4.3.0/css/font-awesome.min.css">
<title>Section Template Title</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<div class="section">
<div class="titlepage">
<div>
<div>
<h2 class="title" style="clear: both">
<a name="d56e3"></a>Section Template Title</h2>
</div>
</div>
<div></div>
<hr>
</div>
<p>birthday cake: <i class='fa fa-birthday-cake'></i></p>
</div>
</body>
</html>
渲染 HTML
选项 3
第三个选项是切换到 XSLT 2.0 并使用xsl:character-map
.
优点
- 简单的概念
- 在 docbook 实例或实体声明中不需要额外的标记
- 感觉很好(不是hacky)
缺点
- XSLT 2.0 所以需要使用 2.0 处理器
- 更改为 2.0 处理器后可能会有其他 XSLT 更改。(例如,在我的测试中,我必须删除
exslt:node-set()
profile-docbook.xsl 中的 3 个用途。)
你需要做什么:
保持您的实体声明如下所示(基于您的其他问题https://stackoverflow.com/questions/30055181/how-do-i-insert-fonts-as-an-entity-in-docbook):
<!ENTITY fa-birthday-cake "">
将链接添加到
head
. (我把它指向本地的字体真棒。)<link rel="stylesheet" href="font-awesome-4.3.0/css/font-awesome.min.css"/>
为了测试我修改了
frameworks/docbook/xsl/html/profile-docbook.xsl
. 我在模板中添加了link
大约 460 行。match="*" mode="process.root"
将版本更改
xsl:stylesheet
为 2.0。导入
xsl:character-map
.<xsl:include href="font-awesome.xsl"/>
我已经包含了一个示例“font-awesome.xsl”。我今天 (2015-05-06) 有了基于 font-awesome 备忘单的完整版本。添加全部内容会使我的答案超过字符限制;让我知道你是否需要它。
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:character-map name="fa"> <xsl:output-character string="<i class='fa fa-birthday-cake'></i>" character=""/> </xsl:character-map> </xsl:stylesheet>
引用.
use-character-maps
_xsl:output
<xsl:output method="html" encoding="ISO-8859-1" indent="no" use-character-maps="fa"/>
可能的额外变化。
就像“缺点”部分中提到的那样,您可能需要对文档样式表进行一些更改,具体取决于您使用的处理器。我使用了 Saxon-HE 9.5.1.3。我通过复制 DocBook HTML 转换场景并更改处理器来做到这一点。
例子...
文档输入
<!DOCTYPE section [
<!ENTITY fa-birthday-cake "">
]>
<section xmlns="http://docbook.org/ns/docbook" version="5.0">
<title>Section Template Title</title>
<para>birthday cake: &fa-birthday-cake;</para>
</section>
HTML 输出(使用修改后的 DocBook HTML 转换场景)
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<link rel="stylesheet" href="font-awesome-4.3.0/css/font-awesome.min.css">
<title>Section Template Title</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<div class="section">
<div class="titlepage">
<div>
<div>
<h2 class="title" style="clear: both">
<a name="d56e3"></a>Section Template Title</h2>
</div>
</div>
<div></div>
<hr>
</div>
<p>birthday cake: <i class='fa fa-birthday-cake'></i></p>
</div>
</body>
</html>
渲染 HTML