Xml 基于父元素的属性

Xml 基于父元素的属性,xml,xsd,xml-validation,Xml,Xsd,Xml Validation,我有一个树结构,我想为它创建一个模式。每个节点下都有两个节点列表。这些列表可以列出相同类型的元素。但是,一个列表中的元素需要两个附加属性。是否有任何方法需要基于其父元素的元素属性 我尝试创建单独的列表类型。一种列表类型只包含元素的选择。另一个包含相同的选择类型,但每个类型都扩展为需要额外的参数。这是可行的,而且非常简单,但它似乎不必要地冗长,我想知道是否有更聪明的解决方案。当前架构如下所示: <?xml version="1.0" encoding="utf-8"?> <xs:

我有一个树结构,我想为它创建一个模式。每个节点下都有两个节点列表。这些列表可以列出相同类型的元素。但是,一个列表中的元素需要两个附加属性。是否有任何方法需要基于其父元素的元素属性

我尝试创建单独的列表类型。一种列表类型只包含元素的选择。另一个包含相同的选择类型,但每个类型都扩展为需要额外的参数。这是可行的,而且非常简单,但它似乎不必要地冗长,我想知道是否有更聪明的解决方案。当前架构如下所示:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://www.example.org/ElementSchema" xmlns="http://www.example.org/ElementSchema"
    elementFormDefault="qualified">

    <!--BaseElementTypes -->
    <xs:element name="BaseElement" type="BaseElementType" />
    <xs:element name="DoubleElement" type="DoubleElementType" />
    <xs:element name="BoundedDoubleElement" type="BoundedDoubleElementType" />

    <!--ElementListTypes -->
    <xs:complexType name="ChildListType">
        <xs:choice minOccurs="1" maxOccurs="unbounded">
            <xs:element ref="BaseElement" />
            <xs:element ref="DoubleElement" />
            <xs:element ref="BoundedDoubleElement" />
        </xs:choice>
    </xs:complexType>

    <xs:complexType name="PropertyListType">
        <xs:choice minOccurs="1" maxOccurs="unbounded">
            <xs:element name="BaseElement">
                <xs:complexType>
                    <xs:complexContent>
                        <xs:extension base="BaseElementType">
                            <xs:attribute name="Role" type="xs:string" use="required" />
                            <xs:attribute name="Tag" type="xs:integer" use="required" />
                        </xs:extension>
                    </xs:complexContent>
                </xs:complexType>
            </xs:element>
            <xs:element name="DoubleElement">
                <xs:complexType>
                    <xs:complexContent>
                        <xs:extension base="DoubleElementType">
                            <xs:attribute name="Role" type="xs:string" use="required" />
                            <xs:attribute name="Tag" type="xs:integer" use="required" />
                        </xs:extension>
                    </xs:complexContent>
                </xs:complexType>
            </xs:element>
            <xs:element name="BoundedDoubleElement">
                <xs:complexType>
                    <xs:complexContent>
                        <xs:extension base="BoundedDoubleElementType">
                            <xs:attribute name="Role" type="xs:string" use="required" />
                            <xs:attribute name="Tag" type="xs:integer" use="required" />
                        </xs:extension>
                    </xs:complexContent>
                </xs:complexType>
            </xs:element>
        </xs:choice>
    </xs:complexType>


    <!--elementTypes -->
    <xs:complexType name="BaseElementType">
        <xs:sequence>
            <xs:element name="Children" type="ChildListType" minOccurs="0" />
            <xs:element name="Properties" type="PropertyListType"
                minOccurs="0" />
        </xs:sequence>
        <xs:attribute name="ID" type="xs:positiveInteger" use="required" />
        <xs:attribute name="Key" type="xs:string" use="required" />
    </xs:complexType>

    <xs:complexType name="DoubleElementType">
        <xs:complexContent>
            <xs:extension base="BaseElementType">
                <xs:sequence>
                    <xs:element name="Value" type="xs:float" />
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

    <xs:complexType name="BoundedDoubleElementType">
        <xs:complexContent>
            <xs:extension base="DoubleElementType">
                <xs:sequence>
                    <xs:element name="DesiredValue" type="xs:float" />
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
</xs:schema>

具体来说,我想知道是否有更好的方法来实现与
PropertyListType
相同的结果

是否有任何方法可以基于元素的属性要求元素具有属性 家长

在XSD 1.0中,没有

xsd1.1中,是:将属性设置为可选,然后
xs:assert
确定特定父元素的每个子元素都有额外的属性是一个示例,展示了如何在XSD 1.1中使用
每..满足
断言