我可以在同一个XML文件中使用xinclude和实体吗?

时间:2012-09-24 16:37:11

标签: xml xslt entity docbook xinclude

我在DocBook 5.0中工作,创建了一个写作/编辑/制作环境。我根据DBG的RNG模式版本验证我的XML。

为了让我的环境更易于使用,我喜欢将我的书分成多个文件,使用xinclude将书的章节拉到书本文件中。在我的XSLT中运行良好。

我喜欢使用系统实体让我的非技术作家/编辑更容易使用一些特殊字符。我为一些常见的特殊字符设置了一个易于使用的名称的实体文件(例如:& emDash; for - )。

我以为我在某个地方读过你不能在同一个XML文件中同时使用实体和xinclude。我只是尝试过它,它验证并转换好。这个可以吗?这里有问题我没看到吗?以下是我在书籍文件顶部声明所有内容的方法:

<?xml version="1.0" encoding="UTF-8"?>
<?oxygen RNGSchema="http://www.oasis-open.org/docbook/xml/5.0/rng/docbookxi.rng" type="xml"?>
<!DOCTYPE book [
<!ENTITY % entities SYSTEM "utilities/entities/entities.ent">
%entities;
]>
<book xmlns="http://docbook.org/ns/docbook" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:opf="http://www.idpf.org/2007/opf" version="5.0" xml:id="book">

感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

您写道“我以为我在某个地方读过您不能在同一个XML文件中同时使用这两个实体和xinclude。”

首先,语言学者的回答:

XInclude规范不禁止使用实体;目前尚不清楚它是否可以连贯地这样做,因为它被定义为在信息集的级别上运行,而不是在XML字符流的级别上运行。并且XML规范不禁止在使用实体时使用XInclude。因此,您所关注的两个功能的定义规范都没有禁止它。

尝试定义使用情况配置文件的其他一些规范可能会禁止同时使用实体和XInclude;我不知道,但这并不意味着什么。但是,如果任何此类配置文件适用于您,我希望您能了解它们。

由于XInclude有时被视为使实体变得不必要的一种方式(好吧,至少是外部实体),一些XInclude爱好者可能会认为使用实体和XInclude是一种不好的品味;如果你碰巧和任何一个有这种感觉的人一起工作并关心他们的想法,这对你很重要,否则你可以自由地向他们挥手并开始你的工作。 (我怀疑如果你读过你记得的那种东西,那就是关于作者认为好的做法或好品味的陈述;它肯定不是关于什么是合法的或技术上可能的事实陈述。)

其次,一个实际的答案:一些处理器和工具链支持使用在外部DTD子集中声明的实体,一些支持XInclude,一些支持两者。检查你关心的工具;如果他们都在使用您想创建的数据,那么您无后顾之忧。