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

时间:2009-10-25 19:03:25

标签: xml validation dtd

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

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

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

表达式和条件具有相同的声明,表示相同的子元素和属性。

1 个答案:

答案 0 :(得分: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>