【问题】
Docbook所生成的HTML的等式Equation,没有特殊处理,比如没有一定的背景色。
而之前已经给PDF中的等式添加了背景色了:
【已解决】给docbook的pdf中的等式(equation)设置背景色
现在想要给HTML中的等式添加类似的背景色。
【解决过程】
1.等式Equation,是属于formal一类的,之前的配置是在:
docbook-xsl-ns-1.76.1\html\formal.xsl
中,然后拷贝出相关代码,再添加相应设置:
<!--============================================================================
equation setting
=============================================================================-->
<xsl:template match="d:equation">
<xsl:attribute name="border-style">solid</xsl:attribute>
<!-- <xsl:attribute name="border-width">.1mm</xsl:attribute> -->
<xsl:attribute name="border-width">0.5pt</xsl:attribute>
<xsl:attribute name="background-color">silver</xsl:attribute>
<xsl:variable name="param.placement"
select="substring-after(normalize-space($formal.title.placement),
concat(local-name(.), ' '))"/>
<xsl:variable name="placement">
<xsl:choose>
<xsl:when test="contains($param.placement, ' ')">
<xsl:value-of select="substring-before($param.placement, ' ')"/>
</xsl:when>
<xsl:when test="$param.placement = ''">before</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$param.placement"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:call-template name="formal.object">
<xsl:with-param name="placement" select="$placement"/>
</xsl:call-template>
</xsl:template>结果出错:
runtime error: file /home/develop/docbook/config_root/docbook-xsl-ns-1.76.1/html/common_html.xsl line 72 element attribute xsl:attribute: Cannot add attributes to an element if children have been already added to the element.
2.然后又去试了:
<xsl:attribute-set name="equation.properties">
<xsl:attribute name="border-color">#000000</xsl:attribute>
<xsl:attribute name="border-style">solid</xsl:attribute>
<xsl:attribute name="border-width">1px</xsl:attribute>
<xsl:attribute name="padding">1em</xsl:attribute>
<xsl:attribute name="background-color">#dddddd</xsl:attribute>
</xsl:attribute-set>结果输出的HTML中的等式,也没有任何背景色等效果。
3.后来发现,其实上述equation所引用的设置是formal.object的配置:
<!-- copy from docbook-xsl-ns-1.76.1\html\formal.xsl -->
<xsl:template name="formal.object">
<xsl:param name="placement" select="'before'"/>
<xsl:param name="class">
<xsl:apply-templates select="." mode="class.value"/>
</xsl:param>
<xsl:call-template name="id.warning"/>
<xsl:variable name="content">
<div class="{$class}">
<xsl:call-template name="anchor">
<xsl:with-param name="conditional" select="0"/>
</xsl:call-template>
<xsl:choose>
<xsl:when test="$placement = 'before'">
<xsl:call-template name="formal.object.heading"/>
<div class="{$class}-contents">
<xsl:apply-templates/>
</div>
<!-- HACK: This doesn't belong inside formal.object; it
should be done by the table template, but I want
the link to be inside the DIV, so... -->
<xsl:if test="local-name(.) = 'table'">
<xsl:call-template name="table.longdesc"/>
</xsl:if>
<xsl:if test="$spacing.paras != 0"><p/></xsl:if>
</xsl:when>
<xsl:otherwise>
<xsl:if test="$spacing.paras != 0"><p/></xsl:if>
<div class="{$class}-contents"><xsl:apply-templates/></div>
<!-- HACK: This doesn't belong inside formal.object; it
should be done by the table template, but I want
the link to be inside the DIV, so... -->
<xsl:if test="local-name(.) = 'table'">
<xsl:call-template name="table.longdesc"/>
</xsl:if>
<xsl:call-template name="formal.object.heading"/>
</xsl:otherwise>
</xsl:choose>
</div>
<xsl:if test="not($formal.object.break.after = '0')">
<br class="{$class}-break"/>
</xsl:if>
</xsl:variable>
<xsl:variable name="floatstyle">
<xsl:call-template name="floatstyle"/>
</xsl:variable>
<xsl:choose>
<xsl:when test="$floatstyle != ''">
<xsl:call-template name="floater">
<xsl:with-param name="class"><xsl:value-of
select="$class"/>-float</xsl:with-param>
<xsl:with-param name="floatstyle" select="$floatstyle"/>
<xsl:with-param name="content" select="$content"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:copy-of select="$content"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>所以打算在其基础上自己改,然后发发现,里面对于content所应用的设置,不是fo的那种xsl:attribute-set,而是通过div和class来匹配,配置html的输出的结果的。
所以就去去看看当前所生成的HTML的equation部分的HTML源码到底是什么,然后发现是这样的:
<div class="equation">
<a name="eq.frame.data.size"></a><p class="title"><b>公式 3.1. Frame Data Size</b></p>
<div class="equation-contents"><span class="mathphrase">
<p>Frame_Data_Size</p>
<p>= Audo_Data_Size + Frame_Padding_Size</p>
<p>= Frame_Time * Frame_Bitrate + Frame_Padding_Size</p>
<p>= (Sample_Number * Time_per_Sample) * Frame_Bitrate + Frame_Padding_Size</p>
<p>= (Sample_Number * (1/Sample_Rate)) * Frame_Bitrate + Frame_Padding_Size</p>
</span></div>
</div>
<br class="equation-break">然后才明白,对于HTML的表格的输出效果的控制,其实也就是类似于之前所看到的:
中对于programlisting,也是通过对应的css来控制的,即用pre.programlisting,然后加上配置参数,就可以了。
所以,打算自己参考其配置,去写equation对应的css配置。
新建一个equation.css,然后里面写上:
pre.programlisting {
background-color: #FFFF99 ;
border: 1px solid #006600 ;
}
div.equation {
background-color: #FFFFBB ;
border: 1px solid #006600 ;
}接着再参考:Using CSS to style HTML,找到HTML的如何使用css文件的的那个参数html.stylesheet,以及相关的html.stylesheet.type,然后添加相应的配置:
<xsl:param name="html.stylesheet.type">text/css</xsl:param> <xsl:param name="html.stylesheet">equation.css</xsl:param>
然后生成的HTML中,打开了一下,发现还是没有效果,但是却看到其HTML源码中,已经有了对应的css引用了:
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>MPEG简介 + 如何计算CBR和VBR的MP3的播放时间</title> <link rel="stylesheet" type="text/css" href="equation.css"> <meta name="generator" content="DocBook XSL-NS Stylesheets V1.76.1">
然后猜测估计是没有把css文件拷贝到输出文件中,所以,就又去手动拷贝equation.css到输出的HTML文件夹中,然后刷新一下页面,HTML中就可以最终达到所需要的效果了,即equation有背景色了:
【总结】
想要给Docbook生成的HTML的等式equation添加背景色,
其实现的方式,和fo(PDF)所用的xsl:attribute-set不同,其是用另外的CSS去格式化HTML 的显示效果的。
即
1.需要另外去写css文件,比如,equation.css:
pre.programlisting {
background-color: #FFFF99 ;
border: 1px solid #006600 ;
}
div.equation {
background-color: #FFFFBB ;
border: 1px solid #006600 ;
}2. 然后再去添加HTML的css参数:
<xsl:param name="html.stylesheet.type">text/css</xsl:param> <xsl:param name="html.stylesheet">equation.css</xsl:param>
3. 生成HTML后,记得把该css文件拷贝到HTML的输出目录,此时,生成的HTML中的等式,才可以显示出对应的颜色。
提示:
1.注意css文件,相对于当前HTML的路径,不要弄错了。
2.此配置HTML中的等式的背景色的办法,其实也适用于其他类型,比如程序代码programlisting等等(上述例子已经包含对应配置了)。
转载请注明:在路上 » 【已解决】给Docbook的HTML的等式添加背景色
