具有简单类型或复杂类型子元素的 XSD 内容模型?



我正在尝试让XML元素能够为其类型属性使用complexTypesimpleType。我对XML和XSD相对较新,我不确定这是否可能。我写了一些测试代码来解释这个问题。

我必须使用的一种半解决方案只是创建两种不同的EntityType类型,但在这种情况下,我不想这样做,因为将所有相同的元素重写为新类型只是为了更改两种EntityType类型中的PhoneNumber元素类型感觉像是浪费代码, 尤其是当EntityType可以包含更多元素时。我尝试研究XML版本1.1并使用xs:alternative,但我不确定它是否适用于这种特定情况。

这是我的 XML:

<?xml version="1.0" encoding="UTF-8"?>
<City>
<Bob>
<Name>Bob</Name>
<PhoneNumber>262-662-6262</PhoneNumber>
</Bob>
<QMart>
<Name>QMart</Name>
<PhoneNumber>
<FAX>#45654</FAX>
<PhoneNumber>262-333-3939</PhoneNumber>
<PhoneNumber2>262-412-8633</PhoneNumber2>
</PhoneNumber>
</QMart>
</City>

这是XSD:

?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="City" type="CityType"/>
<xs:complexType name="CityType">
<xs:sequence>
<xs:element name="Bob" type="EntityType"/>
<xs:element name="QMart" type="EntityType"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="EntityType">
<xs:sequence>
<xs:element name="Name" type="NameType"/>
<!-- I want both Bob and QMart to use the same EntityType type,
but the only difference is that QMart uses the complex
PhoneNumberType for element PhoneNumber, while Bob uses
the simple PhoneNumberValueType for the PhoneNumber element
Bob: <xs:element name="PhoneNumber" type="PhoneNumberValueType"/> 
QMart: <xs:element name="PhoneNumber" type="PhoneNumberType"/>
-->
</xs:sequence>
</xs:complexType>
<xs:complexType name="PhoneNumberType">
<xs:sequence>
<xs:element name="FAX" type="FAXType"/>
<xs:element name="PhoneNumber" type="PhoneNumberValueType"/>
<xs:element name="PhoneNumber2" type="PhoneNumberValueType"/>
</xs:sequence>
</xs:complexType>
<xs:simpleType name="PhoneNumberValueType">
<xs:restriction base="xs:string"/>
</xs:simpleType>
<xs:simpleType name="NameType">
<xs:restriction base="xs:string"/>
</xs:simpleType>
<xs:simpleType name="FAXType">
<xs:restriction base="xs:string"/>
</xs:simpleType>
</xs:schema>

我尝试使用xs:union元素验证 XML 和 XSD,但这仅适用于simpleTypes。我不确定我还能做什么,我的想法已经用完了。任何帮助不胜感激!

关于您的标题问题,请参阅 XSD 是否允许同一元素的简单类型和复杂类型内容? 有许多子问题,我将在下面依次讨论......


我正在尝试让一个 XML 元素能够使用complexTypesimpleType其类型属性。

这句话说得令人困惑,也许是因为您在某种通用意义上使用"属性";在XML的上下文中这样做,其中"属性"意味着非常具体的东西,势必会造成混乱。


关于

两种EntityType类型感觉像是浪费代码,尤其是当EntityType中可能有更多的元素时。

减少此类重复的常用方法是通过xsd:group。 看

  • XSD中之间的区别?
  • 参考 XSD 模型组的特定元素?

关于具有两种电话号码,请考虑使用两个名称不同的元素,每个元素(简单和复杂)类型一个,并在包含内容模型中使用xsd:choice以允许您希望允许电话号码的任一元素。

最新更新