- 1 -
场景
在文档中,我们有时候会在文字中使用颜色。
比如:
在文档中,使用在文字上加颜色来代表一定意义。使用MS Word编写文档的时候,直接在文字上加颜色就可以了。转换成DITA以后,大家会发现在XML编辑器的工具栏中并没有加字体颜色的工具栏,怎样在DITA文档中给文字加颜色呢?
- 2 -
分析
DITA采用内容与样式分离的思想。文字的颜色属于样式,放在样式文件中,并不在DITA文件中。XML编辑器中编辑的是文档的DITA Topic内容,不能直接编辑样式。这就是在XML编辑器中的工具栏中没有给文字加颜色的工具的原因 (菜单中也没有)。
怎么解决这个问题呢?
上例中,如果按照DITA的设计思想,最好是给内容加语义标签,然后使用样式来将标签渲染成不同的颜色。比如将内容设计成这样:
注:是具体的禁止、指令、警告和提示的文字用这些标签包裹
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE topic PUBLIC "-//OASIS//DTD DITA Topic//EN" "topic.dtd">
<topic id="doc123">
<title>国家规定的安全色中表示警告注意的颜色</title>
<body>
<p>法律分析:</p>
<p>国家规定的安全色有红、蓝、黄、绿四种颜色,其含义是:<stop>红色</stop>表示禁止,停止 (也表示防火);<instruction>蓝色</instruction>
表示指令或必须遵守的规定;<warning>黄色</warning>表示警告、注意;<tip>绿色</tip>表示提示、安全状态、通行</p>
</body>
</topic>
这需要在DITA里通过专有化机制,即:Specialization,加入<stop>、<instruction>、<warning>和<tip>标签来实现。这会导致一系列的改动,比如:所有输出样式、处理程序。同时,以后DITA升级了也要单独升级这部分专有化处理。变动和维护成本比较高。
一种折中的方案是,通过DITA中已有的标签和属性来标识数据,然后在样式中根据自定义属性值来用颜色显示内容。比如将内容设计成这样:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE topic PUBLIC "-//OASIS//DTD DITA Topic//EN" "topic.dtd">
<topic id="doc123">
<title>国家规定的安全色中表示警告注意的颜色</title>
<body>
<p>法律分析:</p>
<p>国家规定的安全色有红、蓝、黄、绿四种颜色,其含义是:<ph outputclass="color_red">红色</ph>表示禁止,停止 (也表示防火);<ph
outputclass="color_blue">蓝色</ph>表示指令或必须遵守的规定;<ph outputclass="color_yellow"
>黄色</ph>表示警告、注意;<ph outputclass="color_green">绿色</ph>表示提示、安全状态、通行</p>
</body>
</topic>
然后在样式中根据outputclass来给文字加颜色。
这种方案的好处是使用DITA已有的标签和属性即可,不必使用专有化来创建新的标签,只需要在样式中加一些代码就可以实现。 变动和以后维护的成本相对较低。
- 3 -
方案实现
上边的分析部分已经描述了DITA内容可以做成的样子。那样式这部分怎么实现呢?这部分来说一说。
如果使用的是CSS来发布HTML和PDF,可以使用如下代码:
*[outputclass~="color_red"]{
color: red;
}
*[outputclass~="color_blue"]{
color: blue;
}
*[outputclass~="color_yellow"]{
color: yellow;
}
*[outputclass~="color_green"]{
color: green;
}
将这些代码放到一个文件中,比如叫style.css,然后在发布的时候引用这个样式文件即可(使用DITA-OT是指定args.css属性,将它的值设置成style.css文件的路径)。
输出效果如下:
如果使用XSLT/XSL-FO来发布PDF,要复杂一些,可以使用下边的代码实现:
<?xml version='1.0'?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
version="2.0">
<xsl:template match="*[contains(@outputclass, 'color_red')]">
<fo:inline color="red">
<xsl:apply-templates />
</fo:inline>
</xsl:template>
<xsl:template match="*[contains(@outputclass, 'color_blue')]">
<fo:inline color="blue">
<xsl:apply-templates />
</fo:inline>
</xsl:template>
<xsl:template match="*[contains(@outputclass, 'color_yellow')]">
<fo:inline color="yellow">
<xsl:apply-templates />
</fo:inline>
</xsl:template>
<xsl:template match="*[contains(@outputclass, 'color_green')]">
<fo:inline color="green">
<xsl:apply-templates />
</fo:inline>
</xsl:template>
</xsl:stylesheet>
需要根据DITA-OT定制XSLT/XSL-FO的方法进行配置。
输出效果如下: