从一组首要的minOccurs(overriding minOccurs from a group)

2019-09-29 14:58发布

我有一个情况有一个基本类型,我没有“自己的”,它可以让所有子元素是可选的。 从一般企业的角度来看这是有道理的。 例如,说这是:

<xs:complexType name="BaseType">
    <xs:sequence>
        <xs:element name="id" type="xs:string" minOccurs="0"/>
        <xs:element name="name" type="xs:string" minOccurs="0"/>
    </xs:sequence>
</xs:complexType>

这种类型的实例将包含在我的过程中使用含有类型。

<xs:complexType name="MyType">
    <xs:sequence>
        <xs:element name="Widget" type="BaseType"/>
        ...other stuff...
    <xs:sequence>
</xs:complexType>

但是,对于我的特殊目的,我需要一个基本类型的“身份证”元素是存在始终。 我可以在消耗它,当然代码执行这一点,但有一些方法在XSD来表示呢?

编辑我忘了另外一个。 还有一个,类似的情况,在这里我使用的元素为一组,而不是基本类型英寸

<xs:group name="Address-Group">
    <xs:sequence>
        <xs:element name="street" type="xs:string" minOccurs="0"/>
        <xs:element name="city" type="xs:string" minOccurs="0"/>
        ...etc....
    </xs:sequence>
</xs:group>

如果我使用这些之一的MyType,我不得不对试图重写的minOccurs为类似“城市”同样的问题。

Answer 1:

假设for my particular purposes, I need the 'id' element on a BaseType to be present always你的真正用意始终,那么你可以申请一个重新定义,如下面的一个:

<?xml version="1.0" encoding="utf-8"?>
<!--XML Schema generated by QTAssistant/XSR Module (http://www.paschidev.com)-->
<xsd:schema xmlns="http://tempuri.org/XMLSchema.xsd" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://tempuri.org/XMLSchema.xsd" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:redefine schemaLocation="xsd-overriding-minoccurs-from-a-group.xsd">
        <xsd:complexType name="BaseType">
            <xsd:complexContent>
                <xsd:restriction base="BaseType">
                    <xsd:sequence>
                        <xsd:element name="id" type="xsd:string"/>
                        <xsd:element name="name" type="xsd:string" minOccurs="0"/>
                    </xsd:sequence>
                </xsd:restriction>
            </xsd:complexContent>
        </xsd:complexType>
        <xsd:group name="Address-Group">
            <xsd:sequence>
                <xsd:element name="street" type="xsd:string"/>
                <xsd:element name="city" type="xsd:string" minOccurs="0"/>
            </xsd:sequence>
        </xsd:group>
    </xsd:redefine>
</xsd:schema>

问题是,重新定义的作品“永远”,即在一个基本类型时,重新定义的定义将优先考虑所有实例。 换句话说,没有内置的XSD机制下,您可能能够挑选你的背景下,除非你移动到XSD 1.1,你就不会再需要重新定义,但有些类型的声明。 问题是,我冒昧地说,XSD 1.1甚至更低的支持比XSD 1.0(跨平台的,而不是在一个特定的一个可能发生的同时支持,无论如何,如萨克森或Xerces的)。

一个XML等,这是有效的:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Sample XML generated by QTAssistant (http://www.paschidev.com) -->
<paschidev.dummy xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="BaseType" xmlns="http://tempuri.org/XMLSchema.xsd">
    <id>id1</id>
    <name>name1</name> 
</paschidev.dummy>

而这一次会失败:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Sample XML generated by QTAssistant (http://www.paschidev.com) -->
<paschidev.dummy xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="BaseType" xmlns="http://tempuri.org/XMLSchema.xsd">
    <name>name1</name> 
</paschidev.dummy>

用下面的错误消息(基于.NET):

Error occurred while loading [], line 4 position 3
The element 'paschidev.dummy' in namespace 'http://tempuri.org/XMLSchema.xsd' has invalid child element 'name' in namespace 'http://tempuri.org/XMLSchema.xsd'. List of possible elements expected: 'id' in namespace 'http://tempuri.org/XMLSchema.xsd'.

或本(基于Java):

Error while loading [], line 4 position 8
cvc-complex-type.2.4.a: Invalid content was found starting with element 'name'. One of '{"http://tempuri.org/XMLSchema.xsd":id}' is expected.

在重新定义XSD感知的XML处理器效果很好。 然而,一些XSD编写绑定框架或数据库引擎内置的XSD支持这一个可能会咳嗽。



文章来源: overriding minOccurs from a group