XSD 1.0 中一个元素具有两种不同的定义/类型

问题描述 投票:0回答:1

我必须编写一个 XML 模式(在 XSD 1.0 中)来验证给定文档。

在本文档中,有一个名为

box
的元素,它可以:

  • 两个必填属性

    name
    weight
    以及其他一些可选属性,无内容

  • 一个必需属性

    name
    没有其他属性,以及多个元素作为内容(包括
    box
    元素)。

例如:

<box name="box_1"> <!-- type 2 -->
    <box name="box_2"> <!-- type 2 -->
        <box name="box_3" weight="10" height="5" /> <!-- type 1 -->
        <box name="box_4" weight="15" /> <!-- type 1 -->
    </box>
    <box name="box_5"> <!-- type 2 -->
        <box name="box_6" weight="21" /> <!-- type 1 -->
    </box>
</box>
<box name="box_7" weight="21" /> <!-- type 1 -->

问题在于:

  • 我无法用两种不同的类型定义

    box
    (xmllint 无法识别使用哪种类型,并且会使任何不具有属性
    box
    weight
    无效)

  • 我无法在

    <xs:attributes>
     中添加 
    <xs:choice>

  • 我无法使用

    <xs:alternative>
    ,因为我必须使用XSD 1.0

  • 我无法将

    weight
    设为可选,它必须是必需的

  • 我无法修改给定的xml文档

例如,这不起作用:

<xs:complexType name="closet">
    <xs:choice maxOccurs="unbounded">
        <xs:element name="box" type="TboxComplex" />
        <xs:element name="box" type="TboxSimple" />
    </xs:choice>
</xs:complexType>

<xs:complexType name="TboxComplex">
    <xs:choice maxOccurs="unbounded">
            <xs:element name="box" type="TboxComplex" />
            <xs:element name="box" type="TboxSimple" />
    </xs:choice>
    <xs:attribute name="name"   type="xs:string"  use="required" />
</xs:complexType>

<xs:complexType name="TboxSimple">
    <xs:attribute name="name"   type="xs:string"  use="required" />
    <xs:attribute name="weight" type="xs:integer" use="required" />
    <xs:attribute name="height" type="xs:integer" use="optional" />
</xs:complexType>
> xmllint --schema room.xsd room.xml 
room.xml:9: element box: Schemas validity error : Element 'box', attribute 'weight': The attribute 'weight' is not allowed.`
room.xml:9: element box: Schemas validity error : Element 'box', attribute 'height': The attribute 'height' is not allowed.
room.xml:9: element box: Schemas validity error : Element 'box': Missing child element(s). Expected is ( box ).

您能否帮我找到一种定义该元素的方法,而无需更改 xml 文档或切换到 XSD 1.1?预先感谢您!

xml xsd xsd-1.0
1个回答
0
投票

XSD 1.0 无法定义此约束。您将需要使用一些其他验证技术,例如 XSD 1.1、RelaxNG 或 Schematron;或者,如果您准备向 XML 实例添加

xsi:type
属性,则可以使用 XSD 1.0 来完成此操作。

© www.soinside.com 2019 - 2024. All rights reserved.