这是我需要使用DTD验证的xml文件:
<branch state="hessen">
<city>Marburg</city>
<headquarter/>
<staff manager="yes">Egon</staff>
<staff manager="no">Erna</staff>
<staff manager="no">Claudia</staff>
</branch>
问题是每个分支只允许一个经理。现在的任务是使用DTD文件限制它,但是我现在不知道该怎么做。
这是到目前为止我得到的:
<!ELEMENT insurance (branch*)>
<!ELEMENT branch (city,zentrale?,(staff,staff+))>
<!ATTLIST branch
state ID #REQUIRED
>
<!ELEMENT city (#PCDATA)>
<!ELEMENT headquarter EMPTY>
<!ELEMENT staff (#PCDATA)>
<!ATTLIST staff
manager (yes|no) #REQUIRED
>
我现在如何实施该限制?
答案 0 :(得分:0)
您将无法使用DTD强制执行该规则。
我同意Michael Kay关于使用XML Schema 1.1的建议。
您可以使用xs:assert
来执行规则。
示例...
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" vc:minVersion="1.1"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<xs:element name="branch">
<xs:complexType>
<xs:sequence>
<xs:element ref="city"/>
<xs:element ref="headquarter"/>
<xs:element maxOccurs="unbounded" ref="staff"/>
</xs:sequence>
<xs:attribute name="state" use="required" type="xs:NCName"/>
<xs:assert test="count(staff[@manager='yes']) le 1"/>
</xs:complexType>
</xs:element>
<xs:element name="city" type="xs:NCName"/>
<xs:element name="headquarter">
<xs:complexType/>
</xs:element>
<xs:element name="staff">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:NCName">
<xs:attribute name="manager" use="required" type="xs:NCName"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:schema>
您还可以使用Schematron或XSLT进行规则检查。