如何在 DTD 中定义共享相同声明的元素?
我试过这个导致语法错误:
<!ELEMENT (expression|condition) (code-text+)>
其中表达式和条件具有相同的声明,这意味着相同的子元素和属性。
如何在 DTD 中定义共享相同声明的元素?
我试过这个导致语法错误:
<!ELEMENT (expression|condition) (code-text+)>
其中表达式和条件具有相同的声明,这意味着相同的子元素和属性。
(旁注:原则上我会同意使用 XSD 而不是 DTD(或者,使用RelaxNG,它是 XSD 的一个很好的标准化替代方案,并且更简洁,更容易理解和阅读)。不要太担心扩展代码。它很容易阅读,并赋予你强大的表达能力。它不会被技术所阻碍,它会帮助你构建你需要的东西。像 Visual Studio、Eclipse 等 IDE 有用于构建模型的图形设计工具这使得创建 XSD 变得轻而易举。)
但这并不能回答你的问题。在 DTD 中重用定义非常容易。看看HTML DTD,它一直在发生。关键是使用参数实体。这是一个简单的例子:
<!-- the "model" -->
<!ENTITY % commoncontent
"content | xxx">
<!ENTITY % commonattrs
"att1 CDATA #IMPLIED
att2 CDATA #IMPLIED">
<!-- elements -->
<!ELEMENT root ANY>
<!ELEMENT content ANY>
<!ELEMENT xxx EMPTY>
<!-- elements that share the same model -->
<!ELEMENT hello (%commoncontent;)+>
<!ELEMENT world (%commoncontent;)+>
<!-- adding the attributes to the elements with the same model -->
<!ATTLIST hello %commonattrs;>
<!ATTLIST world %commonattrs;>
这基本上使得hello
和world
元素包含完全相同的属性和内容集。我使用了非强制性和无序元素的定义作为内容,这使得以下 XML 文档对上述 DTD 有效:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root SYSTEM "multipleSharedDefinitions.dtd">
<root>
<hello att1="bla">
<content />
</hello>
<world att1="bla" att2="blabla">
<content />
<xxx />
</world>
</root>