【问题标题】:XSD restrict tag content depending upon attribute valueXSD 根据属性值限制标签内容
【发布时间】:2016-06-03 13:15:59
【问题描述】:

我想定义一个 XSD,它允许一个元素具有关于其属性值之一的特定子级。此属性值是使用多个xsd:enumeration 定义的。

这是我的 XML 可以是这样的:

<root>
    <Conversion type="Phys" />
    <Conversion type="Fact">
        <Factor>13</Factor>
        <Offset>37</Offset>
    </Conversion>
    <Conversion type="List">
        <Item>
            <Key>0</Key>
            <Value>KEY_0</Value>
        </Item>
        <Item>
            <Key>1</Key>
            <Value>KEY_1</Value>
        </Item>
    </Conversion>
</root>

到目前为止,我已经设法将 Conversion 标记限制为只有这 3 个属性,并且只有这 3 个序列作为子项(Factor/OffsetItem 列表;没有)。

这是我的 XSD:

<xs:element name="Conversion">
    <xs:complexType>
        <xs:choice>
            <xs:sequence>
                <xs:element name="Item" maxOccurs="unbounded">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="Key" type="xs:decimal" />
                            <xs:element name="Value" type="xs:string" />
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
            <xs:sequence>
                <xs:element name="Factor" type="xs:double" />
                <xs:element name="Offset" type="xs:double" />
            </xs:sequence>
            <xs:sequence />
        </xs:choice>
        <xs:attribute name="Type">
            <xs:simpleType>
                <xs:restriction base="xs:string">
                    <xs:enumeration value="Fact" />
                    <xs:enumeration value="List" />
                    <xs:enumeration value="Phys" />
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
</xs:element>

我想做的是根据我的属性值来限制孩子,以避免禁止混合属性和内容。

【问题讨论】:

    标签: xml xsd xsd-validation xml-validation


    【解决方案1】:

    您需要 XSD 1.1 来完全按照您的要求进行操作,使内容模型依赖于属性的值。您可以使用条件类型分配甚至断言。

    但是,如果您可以调整您的 XML 设计,您可以使用基本的 XSD 1.0(以及 XSD 1.1):

    <root>
        <Phys/>
        <Fact>
            <Factor>13</Factor>
            <Offset>37</Offset>
        </Fact>
        <List>
            <Item>
                <Key>0</Key>
                <Value>KEY_0</Value>
            </Item>
            <Item>
                <Key>1</Key>
                <Value>KEY_1</Value>
            </Item>
        </List>
    </root>
    

    类型信息通常通过更具体的元素名称而不是通过使用类型属性增加通用元素名称来更好地传达。

    【讨论】:

    • 感谢您的快速回复!我明白你的意思了。实际上,Conversion 标签是 Variable 类型与其他兄弟的一部分。所以它描述了它的变量的“转换类型”。我要试试 XSD 1.1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-21
    • 2012-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多