限制只有一个元素具有DTD的特定属性

时间:2018-08-06 15:11:05

标签: xml dtd

这是我需要使用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
            >

我现在如何实施该限制?

1 个答案:

答案 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进行规则检查。