基于父元素的属性

时间:2016-08-31 11:48:40

标签: xml xsd xml-validation

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

我尝试了创建单独的列表类型。一种列表类型只包含元素选择。另一个包含相同的选择类型,但每种类型都扩展为需要额外的参数。这很有效,但它看起来很简单,我想知道是否有更智能的解决方案。目前架构如下所示:

<?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相同的结果?

1 个答案:

答案 0 :(得分:1)

  

有没有办法根据它来要求元素的属性   父节点。

XSD 1.0 中,没有。

XSD 1.1 中,是:使属性可选,然后xs:assert使特定父元素的每个子元素都具有额外属性。 Here 是一个示例,说明如何在XSD 1.1中使用every..satisfies断言。