加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

覆盖和更改基类型中的Xml元素

发布时间:2020-12-16 23:13:52 所属栏目:百科 来源:网络整理
导读:我有一个xml架构,定义了汽车的基本字段: xs:simpleType name="FuelType" xs:restriction base="xs:string" xs:enumeration value="Regular Unleaded"/ xs:enumeration value="High Octane"/ xs:enumeration value="Leaded"/ /xs:restriction/xs:simpleTypex
我有一个xml架构,定义了汽车的基本字段:

<xs:simpleType name="FuelType">
    <xs:restriction base="xs:string">
        <xs:enumeration value="Regular Unleaded"/>
        <xs:enumeration value="High Octane"/>
        <xs:enumeration value="Leaded"/>
    </xs:restriction>
</xs:simpleType>
<xs:complexType name="CarType">
    <xs:sequence>
        <xs:element name="Make" type="xs:string"/>
        <xs:element name="Model" type="xs:string"/>
        <xs:element name="Cylinders" type="xs:int"/>
        <xs:element name="Fuel" type="FuelType"/>
    </xs:sequence>
</xs:complexType>

现在让我们说我想要定义一个从CarType扩展的本田车型,但它有自己的Fuel定义:

<xs:simpleType name="HondaFuelType">
    <xs:restriction base="xs:string">
        <xs:enumeration value="85"/>
        <xs:enumeration value="87"/>
        <xs:enumeration value="89"/>
        <xs:enumeration value="91"/>
        <xs:enumeration value="93"/>
        <xs:enumeration value="95"/>
    </xs:restriction>
</xs:simpleType>
<xs:complexType name="HondaCarType">
    <xs:complexContent>
        <xs:extension base="car:CarType">
            <xs:sequence>
                <xs:element name="Fuel" type="HondaFuelType"/>
            </xs:sequence>
        </xs:extension>
    </xs:complexContent>
</xs:complexType>

扩展CarType可以获得我想要的一切,但是模式现在允许两个名为Fuel的元素(在不同的命名空间中).这是一个示例Xml实例:

<HondaCar xmlns="HondaNS" xmlns:car="CarNS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="HondaNS D:DevelopmentTemphonda.xsd">
    <car:Make/>
    <car:Model/>
    <car:Cylinders>4</car:Cylinders>
    <car:Fuel>High Octane</car:Fuel>
    <Fuel>87</Fuel>
</HondaCar>

虽然这是完全有效的Xml,但它没有逻辑意义(至少对我来说).我的目的是扩展基类型然后覆盖* Fuel *以仅允许在HondaFuelType中定义的值.

有没有办法可以覆盖或掩盖我的扩展类型中的基本Fuel元素?

解决方法

您可以执行与您描述的内容非常相似的操作,但在XSD中无法完全按照您的描述进行操作.复杂类型CarType的“基础”声明对数据使用者做出了许多承诺,无论是通过限制还是扩展,都必须遵守从中派生的所有类型.其中包括:

> CarType的实例将生成名为Make,Model,Cylinders和Fuel的子项,并指明类型.
> Make和Model元素的值将是字符串.
> Cylinders元素的值将是xs:int.
> Fuel元素的值将从字符串{“Regular Unleaded”,“Leaded”,“High Octane”}中提取.

这是你正在运行的最后一项承诺.

扩展类型时,在内容模型的末尾添加新子项;对于XSD 1.0,对于对扩展有效的任何元素,总是可以从末尾删除零个或多个子元素,并生成一个对基类型有效的元素.这就是为什么你的扩展最终会有两个Fuel元素.

如果您只想要一个Fuel元素,那么您想要做的是限制而不是扩展CarType.但是您所考虑的限制并不是对基本类型的Fuel元素的法律限制.所以限制在这里对你不起作用.

当然,一种可能性是概括CarType以使其Fuel元素接受xs:string,然后将其限制两次,一次产生类似于现有CarType的东西,并且一次产生你想到的本田变体.

我希望这有帮助.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读