1

如何在 DTD 中定义共享相同声明的元素?

我试过这个导致语法错误:

<!ELEMENT (expression|condition) (code-text+)>

其中表达式和条件具有相同的声明,这意味着相同的子元素和属性。

4

1 回答 1

2

(旁注:原则上我会同意使用 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;>

这基本上使得helloworld元素包含完全相同的属性和内容集。我使用了非强制性和无序元素的定义作为内容,这使得以下 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>
于 2009-10-26T01:45:29.160 回答