我正在开发一个从 JAR 文件调用函数的 DITA-OT 插件。当我生成 XHTML 时,插件会找到该函数。当我生成 PDF 时,它不会。我已经阅读了有关创建插件和使 JAR 文件可供它们使用的 DITA-OT 文档,并且我遵循了谷歌的一些线索,但无法弄清楚为什么会发生这种情况。
这是一个演示该行为的简化示例。
这是plugin.xml:
<?xml version="1.0" encoding="UTF-8"?>
<plugin id="com.example.test.import">
<feature extension="dita.conductor.lib.import" file="ztest.jar" />
<feature extension="dita.xsl.xhtml" file="testimport.xsl" />
<feature extension="dita.xsl.xslfo" file="testimport.xsl" />
</plugin>
这是 XSL 样式表 testimport.xsl:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:z="java:ztest.Ztest"
version="2.0" >
<xsl:template match="concept">
<xsl:call-template name="test"
use-when="function-available('z:zmsg')">
<xsl:with-param name="txt"
select="z:zmsg()" />
</xsl:call-template>
<xsl:call-template name="fail"
use-when="not(function-available('z:zmsg'))" />
<xsl:apply-templates />
</xsl:template>
<xsl:template name="test">
<xsl:param name="txt" />
<xsl:message>xxx txt from function z:zmsg = <xsl:value-of select="$txt"/></xsl:message>
</xsl:template>
<xsl:template name="fail">
<xsl:message>xxx Function z:zmsg is not available.</xsl:message>
</xsl:template>
</xsl:stylesheet>
我正在使用 DITA-OT 2.1.2。DITA-OT 未修改(我的插件除外)。没有用于格式化的自定义 XSL。对于 DITA 源,我使用的是 DITA-OT 示例目录中的文件。这是一个简单的概念主题:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE concept PUBLIC "-//OASIS//DTD DITA Concept//EN"
"../../dtd/technicalContent/dtd/concept.dtd">
<concept id="lawnmowerconcept" xml:lang="en-us">
<title>Lawnmower</title>
<shortdesc>The lawnmower is a machine used to cut grass in the yard.</shortdesc>
<conbody><p>Lawnmowers can be electric, gas-powered, or manual.</p></conbody>
</concept>
我尝试使用 dita 命令和 ant 命令从命令行构建。
这是 XHTML 输出的 dita 命令:
c:\dita\dita-ot\bin>dita -i ../samples/concepts/lawnmower.xml -f xhtml -o ../samples/atest -v
这是用于 PDF 输出的 dita 命令:
c:\dita\dita-ot\bin>dita -i ../samples/concepts/lawnmower.xml -f pdf -o ../samples/atest -v
这是用于 XHTML 输出的 ant 命令:
C:\dita\dita-ot\bin>ant -f ..\build.xml -Dargs.input=samples\concepts\lawnmower.xml -Dtranstype=xhtml -Doutput.dir=samples\atest
这是用于 PDF 输出的 ant 命令:
C:\dita\dita-ot\bin>ant -f ..\build.xml -Dargs.input=samples\concepts\lawnmower.xml -Dtranstype=pdf -Doutput.dir=samples\atest
当 transtype 为 xhtml 时,日志中会出现“txt from function z:zmsg”消息:
dita.inner.topics.html.common:
[xslt] Transforming into c:\dita\dita-ot\samples\atest
[xslt] Processing c:\tmp\temp20151105150253420\lawnmower.xml to c:\dita\dita-ot\samples\atest\lawnmower.html
[xslt] Loading stylesheet c:\dita\dita-ot\plugins\org.dita.xhtml\xsl\dita2xhtml.xsl
[xslt] xxx txt from function z:zmsg = String from Ztest.zmsg
...
当transtype为pdf2时,日志中出现“Function z:zmsg is not available”信息:
transform.topic2fo.main:
[xslt] Processing c:\tmp\temp20151105143733996\stage1a.xml to c:\tmp\temp20151105143733996\stage2.fo
[xslt] Loading stylesheet c:\dita\dita-ot\plugins\org.dita.pdf2\xsl\fo\topic2fo_shell_fop.xsl
[xslt] xxx Function z:zmsg is not available.
...
最后,这里是 Ztest 类和 zmsg() 函数的 Java 源代码:
package ztest;
public class Ztest {
public static void main(String[] args) {
System.out.println(zmsg());
}
public static String zmsg() {
return "String from Ztest.zmsg";
}
}
在此示例中,转换未成功完成,但在找到和未找到函数时会显示消息。