XML 的 XSD,其中主元素可以位于结构中的任何位置,并且其子元素的出现基于条件

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

我彻底迷失了。

这就是我想要的:

这是 XML1:

 <EL0 attr0="type1">
   <EL1 attr1="someValue"/>
   <EL2>
    <EL2_SUBEL1>String1</EL2_SUBEL1>
    <EL2_SUBEL2 attr2="value1"/>
   </EL2>
 <EL0>

这是 XML2:

 <EL0 attr0="type2">
   <EL1 attr1="someValue"/>
   <EL2>
    <EL2_SUBEL3>String1</EL2_SUBEL3>
   </EL2>
   <EL3 attr4="value2"/>
 <EL0>

元素是:

  1. 根元素:EL0

  2. 元素,可以位于结构中的任何位置(将来但现在位于根中):

a) El1 具有属性“attr0”

b) EL2

c) El3 具有属性“attr4”

EL2 有 3 个元素,但基于 EL0 attr0 值(“type1”和“type2”):

<EL2_SUBEL1>String1</EL2_SUBEL1>
<EL2_SUBEL2 attr2="value1"/>
<EL2_SUBEL3>String2</EL2_SUBEL3>
  1. 如果 EL0 attr0 值为“type1”,则 EL2 的子元素为 EL2_SUBEL1 和 EL2_SUBEL2

  2. 如果 EL0 attr0 值为“type2”,则 EL2 的子元素为 EL2_SUBEL3

这是我所做的,但有一些错误。

 <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
 
   <!-- Define complex type for EL1 -->
   <xs:complexType name="EL1Type">
     <xs:attribute name="id" type="xs:string"/>
   </xs:complexType>
      
   <!-- Define complex type for EL2_SUBEL1 -->
   <xs:complexType name="EL2_SUBEL1Type">
     <xs:sequence>
       <xs:element name="EL2_SUBEL1" type="xs:string"/>
     </xs:sequence>
   </xs:complexType>
 
   <!-- Define complex type for EL2_SUBEL2 -->
   <xs:complexType name="EL2_SUBEL2Type">
     <xs:sequence>
       <xs:element name="EL2_SUBEL2">
         <xs:complexType>
           <xs:attribute name="value" type="xs:string"/>
         </xs:complexType>
       </xs:element>
     </xs:sequence>
   </xs:complexType>
 
   <!-- Define complex type for EL2_SUBEL3 -->
   <xs:complexType name="EL2_SUBEL3Type">
     <xs:sequence>
       <xs:element name="EL2_SUBEL3" type="xs:string"/>
     </xs:sequence>
   </xs:complexType>
 
   <!-- Define complex type for EL3 -->
   <xs:complexType name="EL3Type">
     <xs:simpleContent>
       <xs:extension base="xs:string">
         <xs:attribute name="number" type="xs:string"/>
       </xs:extension>
     </xs:simpleContent>
   </xs:complexType>
 
   <!-- Define complex type for EL3 for "type1" -->
   <xs:complexType name="type1">
     <xs:sequence>
       <xs:element ref="EL2_SUBEL1" minOccurs="0" maxOccurs="1"/>
       <xs:element ref="EL2_SUBEL2" minOccurs="0" maxOccurs="1"/>
     </xs:sequence>
   </xs:complexType>
 
   <!-- Define complex type for EL3 for "type2" -->
   <xs:complexType name="type2">
     <xs:sequence>
       <xs:element ref="EL2_SUBEL3" minOccurs="0" maxOccurs="1"/>
     </xs:sequence>
   </xs:complexType>
 
   <!-- Define the root element "EL0" -->
   <xs:element name="EL0">
     <xs:complexType>
       <xs:sequence>
         <xs:element name="EL1" type="EL1Type"/>
         <xs:element name="EL3">
           <xs:complexType>
             <xs:choice>
               <xs:element ref="EL2_SUBEL1" minOccurs="0" maxOccurs="1"/>
               <xs:element ref="EL2_SUBEL2" minOccurs="0" maxOccurs="1"/>
               <xs:element ref="EL2_SUBEL3" minOccurs="0" maxOccurs="1"/>
             </xs:choice>
           </xs:complexType>
         </xs:element>
         <xs:element name="EL3" type="EL3Type"/>
       </xs:sequence>
       <xs:attribute name="type" type="xs:string" use="required"/>
     </xs:complexType>
   </xs:element>
 
 </xs:schema>
 

但是,当然,这是行不通的。

xml xsd
1个回答
0
投票

对于这种约束:

if EL0 attr0 value is "type1" 
   then sub-elements of EL2 are EL2_SUBEL1 and EL2_SUBEL2
if EL0 attr0 value is "type2" 
   then sub-elements of EL2 is EL2_SUBEL3

您需要 XSD 1.1。这完全适合“条件类型分配”功能,该功能使元素的复杂类型以其属性值为条件。

有许多模式处理器支持 XSD 1.1,但许多仅支持 1.0。如果您无法使用 1.1 处理器,则无法定义这些约束,因此您必须使用其他一些处理来补充 XSD 验证,例如使用 Schematron 或自定义 XSLT 验证阶段。

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