0

我应该采取哪些步骤在 docbook xml 文件中创建一个占位符,该文件将在生成的 HTML 输出中使用字体真棒字体。寻找在从 DocBook 生成的 HTML 输出中使用字体真棒字体的 xslt 示例。

4

1 回答 1

3

希望这个答案不是tl;博士。如果您希望我将其分解为 3 个单独的答案,请告诉我。

选项1

第一个选项是在实体声明中使用 HTML 标记,就像我在评论中第一次提到的那样。

优点

  • XSLT 1.0 对文档样式表的 XSLT 更改极少

缺点

  • ihtml 元素无效,因此您的文档中会出现验证错误
  • 感觉就像一个黑客

你需要做什么:

  1. 将您的实体声明更改为如下所示:

    <!ENTITY fa-birthday-cake "<i class='fa fa-birthday-cake' xmlns=''></i>">
    

    这与我在第一条评论中的内容略有不同。我添加了一个空命名空间,以便该i元素不会自动位于默认命名空间中。

  2. 将链接添加到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"

  3. 添加模板以匹配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

呈现的 HTML

选项 2

第二种选择是在实体声明中使用 font awesome 类,并使用symbol具有特殊role属性的元素来保存引用。

优点

  • XSLT 1.0 对文档样式表的 XSLT 更改极少
  • symbol是一个 DocBook 元素,所以你不应该有验证问题

缺点

  • symbol可能并非在您需要使用字体真棒图标的所有地方都可用
  • 感觉就像一个 hacky 使用symbol(可能不像第一个选项那样 hacky)

你需要做什么:

  1. 将您的实体声明更改为如下所示:

    <!ENTITY fa-birthday-cake "fa-birthday-cake">
    
  2. 将链接添加到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"

  3. 添加模板以匹配symbol元素与 'fa'role并输出i. (d绑定到http://docbook.org/ns/docbookprofile-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

呈现的 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 个用途。)

你需要做什么:

  1. 保持您的实体声明如下所示(基于您的其他问题https://stackoverflow.com/questions/30055181/how-do-i-insert-fonts-as-an-entity-in-docbook):

    <!ENTITY fa-birthday-cake "&#xf1fd;">
    
  2. 将链接添加到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"

  3. 将版本更改xsl:stylesheet为 2.0。

  4. 导入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="&lt;i class='fa fa-birthday-cake'&gt;&lt;/i&gt;" character="&#xf1fd;"/>
        </xsl:character-map>
    </xsl:stylesheet>
    
  5. 引用. use-character-maps_xsl:output

    <xsl:output method="html" encoding="ISO-8859-1" indent="no" use-character-maps="fa"/>
    
  6. 可能的额外变化。

    就像“缺点”部分中提到的那样,您可能需要对文档样式表进行一些更改,具体取决于您使用的处理器。我使用了 Saxon-HE 9.5.1.3。我通过复制 DocBook HTML 转换场景并更改处理器来做到这一点。

例子...

文档输入

<!DOCTYPE section [
<!ENTITY fa-birthday-cake "&#xf1fd;">
]>
<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

呈现的 HTML

于 2015-05-06T23:54:27.550 回答