最简单的方式是使用略微不同的 XML 结构。 您想要一个主地址和零或更多的非主地址。 任何 XML 验证方法( DTDs, XSD,...) 都很容易说, 如果您对有不同要求的东西使用不同的名称。 如果 XML 结构变成这样, 则使用不同的名称 。
<addresses>
<primary-address>
<street>One str.</street>
<number>111</number>
</primary-address>
<address>
<street>Two str.</street>
<number>222</number>
</address>
</addresses>
然后很容易写出 XSD 模式,它限制 < code> addresses 精确包含一个主地址,并明确显示主地址和其他地址的结构相同:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">
<xsd:complexType name="address">
<xsd:sequence>
<xsd:element ref="street"/>
<xsd:element ref="number"/>
</xsd:sequence>
</xsd:complexType>
<xsd:element name="primary-address" type="address"/>
<xsd:element name="address" type="address"/>
<xsd:element name="addresses">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="primary-address"/>
<xsd:element ref="address" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:complexType name="mixed" mixed="true">
<xsd:sequence/>
</xsd:complexType>
<xsd:element name="street" type="mixed"/>
<xsd:element name="number" type="mixed"/>
</xsd:schema>
如果您不能改变您的 XML 结构, 或者不想改变, 您可以切换到 XSD 1. 1. 1 并使用声明来强制执行限制, 或者您可以使用Schematron来这样做 。
或者(这是一个略为肮脏的把戏),你可以说 (1), broad
属性的唯一法律价值是 true
, (2) 该属性在 mail
元素上是可选的, (3) 每一次出现 big
属性都必须有一个独特的价值 。
但我真的建议改变XML结构