【问题】
docbook中的某个xsl的配置如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <? xml version = '1.0' ?> 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的实体定义,是知道的。
可以参考这里:
写出类似的实体定义:
1 | <!ENTITY xsl_ns_base_dir "/home/CLi/develop/docbook/tools/docbook-xsl-ns-1.76.1"> |
但是此处是xsl文件,不是xml,所以行不通。
2.后来参考:
Define entity in style sheet
中的解释,写出了这样的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <? xml version = '1.0' ?> 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 > |
结果编译始终出错:
1 2 3 4 5 6 7 8 9 10 11 12 | 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写在最开始的部分,就可以了:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <?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" 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中定义实体的话,首先写出对应定义:
1 | <!ENTITY xsl_ns_base_dir "/home/CLi/develop/docbook/tools/docbook-xsl-ns-1.76.1"> |
然后将DOCTYPE的部分:
1 2 3 | <!DOCTYPE stylesheet [ <!ENTITY xsl_ns_base_dir "/home/CLi/develop/docbook/tools/docbook-xsl-ns-1.76.1"> ]> |
放在
<?xml version=’1.0′?>
之后,
1 2 3 4 5 6 7 | exclude-result-prefixes = "db ng exsl" version = '1.0' > |
之前,然后后面就可以通过:
&xsl_ns_base_dir; |
的方式去引用了。
其中,即使在双引号之内的引用:
1 | < xsl:import href = "&xsl_ns_base_dir;/fo/docbook.xsl" /> |
也是支持的。
转载请注明:在路上 » 【已解决】如何给(docbook中的)xsl中定义实体Entity