在Docbook生成的HTML中使用字体awesome

时间:2015-05-04 21:02:57

标签: xml xslt docbook docbook-5 docbook-xsl

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

1 个答案:

答案 0 :(得分:2)

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

选项1

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

<强>赞成

  • XSLT 1.0,以便将最小的XSLT更改为docbook样式表

<强>缺点

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

您需要做什么:

  1. 将您的实体声明更改为:

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

    这与我在第一次评论中略有不同。我添加了一个空名称空间,以便i元素不会自动出现在默认名称空间中。

  2. 将链接添加到head中的font-awesome css。 (我把它指向本地的字体很棒。)

    <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>
    
  4. 示例...

    Docbook输入

    <!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>
    

    Rendererd HTML

    Rendered HTML

    选项2

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

    <强>赞成

    • XSLT 1.0,以便将最小的XSLT更改为docbook样式表
    • symbol是一个DocBook元素,因此您不应该有验证问题

    <强>缺点

    • symbol可能无法在您使用字体真棒图标所需的所有地方使用
    • 感觉就像是symbol的hacky使用(虽然可能不像第一个选项那样hacky)

    您需要做什么:

    1. 将您的实体声明更改为:

      <!ENTITY fa-birthday-cake "fa-birthday-cake">
      
    2. 将链接添加到head中的font-awesome css。 (我把它指向本地的字体很棒。)

      <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绑定到profile-docbook.xsl中的http://docbook.org/ns/docbook命名空间

      <xsl:template match="d:symbol[@role='fa']">
          <i class="fa {.}"></i>
      </xsl:template>
      
    4. 示例...

      Docbook输入

      <!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>
      

      Rendererd HTML

      Rendered HTML

      选项3

      第三个选项是切换到XSLT 2.0并使用xsl:character-map

      <强>赞成

      • 简单概念
      • docbook实例或实体声明中不需要其他标记
      • 感觉良好(不是hacky)

      <强>缺点

      • XSLT 2.0所以需要使用2.0处理器
      • 更改为2.0处理器后,可能会有其他XSLT更改。 (例如,在我的测试中,我必须删除profile-docbook.xsl中的3 exslt:node-set()次使用。)

      您需要做什么:

      1. 让您的实体声明看起来像这样(基于您的其他问题https://stackoverflow.com/questions/30055181/how-do-i-insert-fonts-as-an-entity-in-docbook):

        <!ENTITY fa-birthday-cake "&#xf1fd;">
        
      2. 将链接添加到head中的font-awesome css。 (我把它指向本地的字体很棒。)

        <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)。添加整个内容会将我的答案推到字符限制上;如果你需要,请告诉我。

        <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. 可能的其他更改。

        如“cons”部分所述,您可能需要根据您使用的处理器对docbook样式表进行一些更改。我使用了Saxon-HE 9.5.1.3。我这样做是通过复制DocBook HTML转换场景和更改处理器来实现的。

      7. 示例...

        Docbook输入

        <!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>
        

        Rendererd HTML

        Rendered HTML