最新消息:20210816 当前crifan.com域名已被污染,为防止失联,请关注(页面右下角的)公众号

【已解决】如何给(docbook中的)xsl中定义实体Entity

Docbook crifan 2244浏览 0评论

【问题】

docbook中的某个xsl的配置如下:

<?xml version='1.0'?>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:exsl="http://exslt.org/common"
                xmlns:fo="http://www.w3.org/1999/XSL/Format"
                xmlns:ng="http://docbook.org/docbook-ng"
                xmlns:db="http://docbook.org/ns/docbook"
                exclude-result-prefixes="db ng exsl"
                version='1.0'>

<xsl:import href="/home/CLi/develop/docbook/tools/docbook-xsl-ns-1.76.1/fo/docbook.xsl"/>

<xsl:param name="admon.graphics.path">/home/CLi/develop/docbook/tools/docbook-xsl-ns-1.76.1/images/</xsl:param>

</xsl:stylesheet>

想要将其中的路径:

/home/CLi/develop/docbook/tools/docbook-xsl-ns-1.76.1

定义为一个实体,这样方便以后引用。

【解决过程】

1.对于docbook中的xml的实体定义,是知道的。

可以参考这里:

XML入门教程:实体

写出类似的实体定义:

<!ENTITY xsl_ns_base_dir "/home/CLi/develop/docbook/tools/docbook-xsl-ns-1.76.1">

但是此处是xsl文件,不是xml,所以行不通。

2.后来参考:

Define entity in style sheet

中的解释,写出了这样的:

<?xml version='1.0'?>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:exsl="http://exslt.org/common"
                xmlns:fo="http://www.w3.org/1999/XSL/Format"
                xmlns:ng="http://docbook.org/docbook-ng"
                xmlns:db="http://docbook.org/ns/docbook"
                exclude-result-prefixes="db ng exsl"
                version='1.0'>

<!DOCTYPE stylesheet [
<!ENTITY xsl_ns_base_dir "/home/CLi/develop/docbook/tools/docbook-xsl-ns-1.76.1">
]>

<!-- <xsl:import href="/home/CLi/develop/docbook/tools/docbook-xsl-ns-1.76.1/fo/docbook.xsl"/> -->
<xsl:import href="&xsl_ns_base_dir;/fo/docbook.xsl"/>

<!-- <xsl:param name="admon.graphics.path">/home/CLi/develop/docbook/tools/docbook-xsl-ns-1.76.1/images/</xsl:param> -->
<xsl:param name="admon.graphics.path">&xsl_ns_base_dir;/images/</xsl:param>

</xsl:stylesheet>

结果编译始终出错:

CLi@PC-CLI-1 ~/develop/docbook/books/VBR/VBR/src
$ xsltproc.exe --xinclude -o ../output/fo/MPEG_VBR.fo /home/CLi/develop/docbook/config/docbook-xsl-ns-1.76.1/fo/docbook_crl.xsl MPEG_VBR.xml
/home/CLi/develop/docbook/config/docbook-xsl-ns-1.76.1/fo/docbook_crl.xsl:11: parser error : StartTag: invalid element name
<!DOCTYPE stylesheet [
 ^
/home/CLi/develop/docbook/config/docbook-xsl-ns-1.76.1/fo/docbook_crl.xsl:12: parser error : StartTag: invalid element name
<!ENTITY xsl_ns_base_dir "/home/CLi/develop/docbook/tools/docbook-xsl-ns-1.76.1"
 ^
/home/CLi/develop/docbook/config/docbook-xsl-ns-1.76.1/fo/docbook_crl.xsl:138: parser error : Entity 'xsl_ns_base_dir' not defined
<xsl:param name="admon.graphics.path">&xsl_ns_base_dir;/images/</xsl:param>
                                                       ^
cannot parse /home/CLi/develop/docbook/config/docbook-xsl-ns-1.76.1/fo/docbook_crl.xsl

后来折腾了好多次,终于搞清楚了,把DOCTYPE写在最开始的部分,就可以了:

<?xml version='1.0'?>

<!DOCTYPE stylesheet [
<!ENTITY xsl_ns_base_dir "/home/CLi/develop/docbook/tools/docbook-xsl-ns-1.76.1">
]>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:exsl="http://exslt.org/common"
                xmlns:fo="http://www.w3.org/1999/XSL/Format"
                xmlns:ng="http://docbook.org/docbook-ng"
                xmlns:db="http://docbook.org/ns/docbook"
                exclude-result-prefixes="db ng exsl"
                version='1.0'>

<!-- <xsl:import href="/home/CLi/develop/docbook/tools/docbook-xsl-ns-1.76.1/fo/docbook.xsl"/> -->
<xsl:import href="&xsl_ns_base_dir;/fo/docbook.xsl"/>

<!-- <xsl:param name="admon.graphics.path">/home/CLi/develop/docbook/tools/docbook-xsl-ns-1.76.1/images/</xsl:param> -->
<xsl:param name="admon.graphics.path">&xsl_ns_base_dir;/images/</xsl:param>

</xsl:stylesheet>

 

【总结】

想要在xsl中定义实体的话,首先写出对应定义:

<!ENTITY xsl_ns_base_dir "/home/CLi/develop/docbook/tools/docbook-xsl-ns-1.76.1">

然后将DOCTYPE的部分:

<!DOCTYPE stylesheet [
<!ENTITY xsl_ns_base_dir "/home/CLi/develop/docbook/tools/docbook-xsl-ns-1.76.1">
]>

放在

<?xml version=’1.0′?>

之后,

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:exsl="http://exslt.org/common"
                xmlns:fo="http://www.w3.org/1999/XSL/Format"
                xmlns:ng="http://docbook.org/docbook-ng"
                xmlns:db="http://docbook.org/ns/docbook"
                exclude-result-prefixes="db ng exsl"
                version='1.0'>

之前,然后后面就可以通过:

&xsl_ns_base_dir;

的方式去引用了。

其中,即使在双引号之内的引用:

<xsl:import href="&xsl_ns_base_dir;/fo/docbook.xsl"/>

也是支持的。

转载请注明:在路上 » 【已解决】如何给(docbook中的)xsl中定义实体Entity

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
82 queries in 0.153 seconds, using 22.19MB memory