重新定义复杂类型元素的基数。有可能吗?

时间:2019-04-09 18:02:30

标签: xml xsd schema

我想使用预定义的复杂类型,并在其元素之一上修改基数。我该怎么做而不使用覆盖/定义(我不想分割XSD文件)。甚至有可能吗?

示例:在发生事件的情况下,我希望组织者的出生日期(person_type)是强制性的。但是对于每个来宾(也包括person_type),它必须是可选的。

我尝试使用限制/扩展名,但它不符合我的需求。 显然,它可以使用2种复杂类型(即person_type1 / birth_date 1..1,person_type2 / birth_date 0..1)使用,但它是丑陋的国王。

如何在guest元素中使用复杂类型“ person_type”,并且生日发生基数更改?

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema elementFormDefault="qualified" attributeFormDefault="unqualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
   <xs:complexType name="event_type">
      <xs:sequence>
         <xs:element name="event_name" type="xs:string"/>
         <xs:element name="organizer" type="person_type"/>
         <xs:element name="guests_list">
            <xs:complexType>
               <xs:sequence>
                  <xs:element name="guest" type="person_type" maxOccurs="99"/>
               </xs:sequence>
            </xs:complexType>
         </xs:element>
      </xs:sequence>
   </xs:complexType>
   <xs:complexType name="person_type">
      <xs:sequence>
         <xs:element name="first_name" type="xs:string"/>
         <xs:element name="last_name" type="xs:string"/>
         <xs:element name="birth_date" type="xs:string"/>
      </xs:sequence>
   </xs:complexType>
   <xs:element name="event" type="event_type"/>
</xs:schema>

为了使该文件有效:

<?xml version="1.0" encoding="UTF-8"?>
<event>
   <event_name>Party !!</event_name>
   <organizer>
      <first_name>John</first_name>
      <last_name>Doe</last_name>
      <birth_date>01/01/1970</birth_date>
   </organizer>
   <guests_list>
      <guest>
         <first_name>Jane</first_name>
         <last_name>Doe</last_name>
      </guest>
      <guest>
         <first_name>Foo</first_name>
         <last_name>Bar</last_name>
      </guest>
   </guests_list>
</event>

感谢您的回答。

1 个答案:

答案 0 :(得分:0)

对于这种事情,我越来越倾向于使用XSD 1.1断言。这比使用限制和扩展要方便得多。

具体来说,将complexType定义为自由类型,然后在相关元素声明的xs:assert中定义上下文相关的约束。