我有一个XML文档:
<?xml version="1.0" encoding="utf-8"?>
<Data>
<AddressStreetNumber>123</AddressStreetNumber>
<AddressStreetName>Main St</AddressStreetName>
<AddressUnitNumber>10-B</AddressUnitNumber>
<AddressUnitType>Apt</AddressUnitType>
<AddressLine1>123 Main St Apt 10-B</AddressLine1>
</Data>
我希望XSD中的定义记录要包含的前4个元素或要包含的最后一个元素。基本上,消费者可以选择拆分地址或仅使用元素“addressline1”来放置整个address1信息。我如何在XSD中描述这一点?我尝试过使用xsd:group和xsd:choice但它似乎无法工作(或验证)。
示例:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:group name="householdaddress1parts">
<xs:all>
<xs:element name="AddressStreetNumber" type="xs:unsignedInt" minOccurs="0" />
<xs:element name="AddressStreetName" minOccurs="0" >
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:minLength value="1"/>
<xs:maxLength value="100"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="AddressUnitNumber" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:minLength value="1"/>
<xs:maxLength value="16"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="AddressUnitType" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:minLength value="1"/>
<xs:maxLength value="16"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:all>
</xs:group>
<xs:group name="householdaddress1">
<xs:all>
<xs:element name="AddressLine1" minOccurs="0" >
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:minLength value="1"/>
<xs:maxLength value="164"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:all>
</xs:group>
<xs:choice minOccurs="0">
<xs:group ref="householdaddress1parts"></xs:group>
<xs:group ref="householdaddress1"></xs:group>
</xs:choice>
</xs:schema>
我已经尝试了其他一些变化,但我猜我甚至在阅读了一段时间的文档之后完全偏离了轨道(或者它可能是非常明显的事情)。这是我第一次涉足XSD,我确信它会显示出来。对此有任何帮助表示赞赏。
答案 0 :(得分:3)
此XML文档:
<?xml version="1.0" encoding="utf-8"?>
<Data>
<AddressStreetNumber>123</AddressStreetNumber>
<AddressStreetName>Main St</AddressStreetName>
<AddressUnitNumber>10-B</AddressUnitNumber>
<AddressUnitType>Apt</AddressUnitType>
</Data>
这个XML文档:
<?xml version="1.0" encoding="utf-8"?>
<Data>
<AddressLine1>123 Main St Apt 10-B</AddressLine1>
</Data>
对此XSD有效:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Data">
<xs:complexType>
<xs:choice>
<xs:sequence>
<xs:element name="AddressStreetNumber"/>
<xs:element name="AddressStreetName"/>
<xs:element name="AddressUnitNumber"/>
<xs:element name="AddressUnitType"/>
</xs:sequence>
<xs:element name="AddressLine1"/>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>