【问题】
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的实体定义,是知道的。
可以参考这里:
写出类似的实体定义:
<!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