XSD中是否可以使用具有不同属性的相同元素?
我试过这样的事情:
<xsd:complexType name="Type1">
<xsd:attribute name="id" type="xsd:integer" use="required"/>
<xsd:attribute name="attribute1" type="xsd:integer" use="required"/>
</xsd:complexType>
<xsd:complexType name="Type2">
<xsd:attribute name="id" type="xsd:integer" use="required"/>
<xsd:attribute name="attribute2" type="xsd:string" use="optional"/>
</xsd:complexType>
<xsd:element name="address">
<xsd:complexType>
<xsd:choice>
<xsd:choice>
<xsd:element name="elementName" type="Type1"/>
<xsd:element name="elementName" type="Type2"/>
</xsd:choice>
</xsd:choice>
</xsd:complexType>
</xsd:element>
怎么做? address
元素应为Type1
或Type2
。每种类型都有不同的属性。
答案 0 :(得分:0)
不,这不会起作用
请参阅3.8.6.3 Element Declarations Consistent in the specs。
用我的话说:同一组中的两个元素必须具有相同的结构,XSD中没有签名超载。
您必须使用元素名称(或命名空间)来区分这两种变体。如果您可能希望将绑定框架(JAXB或XmlSerializer)与XML语言一起使用,这也是一个好主意。那些很可能无法处理你的构造。
编辑:这是继承我们讨论的继承示例:
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xsd:complexType name="Base" abstract="true">
<xsd:attribute name="id" type="xsd:integer" use="required"/>
</xsd:complexType>
<xsd:complexType name="Type1">
<xsd:complexContent>
<xsd:extension base="Base">
<xsd:attribute name="attribute1" type="xsd:integer" use="required"/>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
<xsd:complexType name="Type2">
<xsd:complexContent>
<xsd:extension base="Base">
<xsd:attribute name="attribute2" type="xsd:string" use="optional"/>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
<xsd:element name="address" >
<xsd:complexType>
<xsd:sequence>
<xsd:element name="elementName" type="Base" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<?xml version="1.0" encoding="UTF-8"?>
<address xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Untitled1.xsd">
<elementName id="1" attribute1="123" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Type1"/>
<elementName id="1" attribute2="123" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Type2"/>
</address>
这或多或少都是您所描述的,但需要您添加xxi:type属性。我没有看到好处。
答案 1 :(得分:0)
<xsd:complexType name="Base">
<xsd:attribute name="id" type="xsd:integer" use="required"/>
</xsd:complexType>
<xsd:complexType name="Type1">
<xsd:complexContent>
<xsd:extension base="Base">
<xsd:attribute name="attribute1" type="xsd:integer" use="required"/>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
<xsd:complexType name="Type2">
<xsd:complexContent>
<xsd:extension base="Base">
<xsd:attribute name="attribute2" type="xsd:string" use="optional"/>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
<xsd:element name="address">
<xsd:complexType>
<xsd:choice>
<xsd:choice>
<xsd:element name="elementName" xml:base="Base"/>
</xsd:choice>
</xsd:choice>
</xsd:complexType>
</xsd:element>
代码,通过验证。
答案 2 :(得分:0)
“元素声明一致”约束(在XSD 1.0和1.1中都存在)表示如果两个兄弟元素具有相同的名称,则它们必须具有相同的类型。所以简单的答案是否定的。但是,在XSD 1.1中,您可以通过为两个元素提供相同类型(允许任何属性集的类型)然后使用断言定义其他约束(在父元素上)来处理它。