是否可以使用嵌套的 XML DTD 实体声明?我做了一些研究,但找不到满足我要求的解决方案。
我目前正在使用的:
<!DOCTYPE test [
<!ENTITY system "SystemA">
<!ENTITY path SYSTEM "file:./path/to/SystemA">
<!ENTITY config_file SYSTEM "file:./config/for/SystemA.config">
]>
Run Code Online (Sandbox Code Playgroud)
由于“SystemA”已经在变量system中声明,我更愿意使用声明的变量system而不是在所有后续声明中使用“SystemA”。
如果您只想将通用实体作为正文内容中的文本字符串扩展到文件路径,则可以立即执行此操作:
<!ENTITY system "SystemA">
<!ENTITY path "&system;.config">
Run Code Online (Sandbox Code Playgroud)
但是,如果您想从 .config 文件中获取标记声明以使它们成为 DTD 的一部分,那么您需要一个外部实体声明(正如您已经弄清楚的那样)。为了在声明中使用文本替换(而不是内容),您必须使用参数实体而不是一般实体。参数实体使用百分号声明(请注意声明中百分号后面的空格,而参数实体引用则不能有空格;
<!ENTITY % paramentity "SystemA">
Run Code Online (Sandbox Code Playgroud)
现在您可以使用for 替换标记声明中的%paramentity;字符串 ;SystemA
<!ELEMENT x ..,>
%paramentity;
Run Code Online (Sandbox Code Playgroud)
尽管上面的代码会给出错误,因为字符串SystemA(或任何其他字符数据)不允许出现在 DTD/文档序言中。
不过,还有一个额外的问题:参数实体引用不会在标识符文字中扩展,因此这不起作用:
<!ENTITY % myent SYSTEM "%paramentity;/f.config">
Run Code Online (Sandbox Code Playgroud)
相反,所发生的情况是该字符串%paramentity;/f.config被逐字作为 的替换值%myent;。要从参数实体构建系统标识符,您应该将文字标记作为一个整体:
<!ENTITY % sysid "'filename'">
<!ENTITY file SYSTEM %sysid;>
Run Code Online (Sandbox Code Playgroud)
XML 的这种行为是由于 SGML(XML 是从 SGML 派生出来的子集)造成的。具体来说,SGML 提出了许多限制,其中参数实体扩展可以出现在文档序言中(或者,对于 SGML,但不能出现在没有这些限制的 XML 中),也可以出现在内容中的标记声明中(例如标记的节声明)。SGML 这样做是为了防止混淆使用标记。
| 归档时间: |
|
| 查看次数: |
774 次 |
| 最近记录: |