具有不同属性的相同元素名称

时间:2014-07-16 15:57:45

标签: xml xsd

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元素应为Type1Type2。每种类型都有不同的属性。

3 个答案:

答案 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中,您可以通过为两个元素提供相同类型(允许任何属性集的类型)然后使用断言定义其他约束(在父元素上)来处理它。