2011-11-04 22 views
1

说,我应该有且仅有一个AnimalElement类型,像这样一个PetCage元素:XSD:One和某种类型的一个因素应被宣布

<PetCage> 
    <Cat Name="Kitty"> 
</PetCage> 

<PetCage> 
    <Dog Name="Buddy"> 
</PetCage> 

两个CatDogAnimanlElement类型。我如何在XSD中表达所述规则?

回答

2

你需要的是在你的模式中的choice element。它可以让你表达只有一组元素可能出现。

编辑:您需要指定元素的名称,可以直接通过name或通过ref引用其他地方定义的元素。

你唯一的选择据我所知是有这样的事情:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"> 

    <xs:element name="PetCage"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="animal" type="Animal" minOccurs="1" maxOccurs="1"/> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 

    <xs:complexType name="Animal" abstract="true"> 
     <xs:attribute name="Name" type="xs:string" /> 
    </xs:complexType> 

    <xs:complexType name="Cat"> 
     <xs:complexContent> 
      <xs:extension base="Animal"></xs:extension> 
     </xs:complexContent> 
    </xs:complexType> 

</xs:schema> 

这将验证这样一个形式的XML文件:

<?xml version="1.0" encoding="UTF-8"?> 
<PetCage> 
    <animal xsi:type="Cat" Name="String"/> 
</PetCage> 

很不幸,这让你绑定到那个animal元素名称。我怀疑XML Schema允许你指定一个特定的类型,并让你使用通配符作为名字。 XML Schema基于元素名称进行验证,并且如果该元素使用抽象类型定义,则为xsi:type属性。有一个xs:any声明,但不能绑定到任何特定的类型。下面将尽可能地进行验证,但仍允许使用的图根目录下定义的任何元素:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"> 

    <xs:element name="PetCage"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:any processContents="strict" /> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 

    <xs:complexType name="Animal" abstract="true"> 
     <xs:attribute name="Name" type="xs:string" /> 
    </xs:complexType> 

    <xs:element name="cat" /> 
    <xs:complexType name="Cat"> 
     <xs:complexContent> 
      <xs:extension base="Animal"></xs:extension> 
     </xs:complexContent> 
    </xs:complexType> 

</xs:schema> 

这将正确地验证这一点:

<?xml version="1.0" encoding="UTF-8"?> 
<PetCage> 
    <cat Name="snookums"/> 
</PetCage> 

...但它止跌”不要阻止你将PetCage放入PetCage。

我希望能熟悉XML Schema规范的人可以确认这是正确的,或者最好提供所需的解决方案。

+0

正确的,选择让我从一组元素,可能会出现的只有一个表达。但是,我不明白如何告诉选择元素只允许来自同一类型元素的一个元素。 。一个例子会很棒。 – Ian

2
<xs:complexType name="PetCage"> 
    <xs:choice> 
     <xs:element name="Cat" type="AnimanlElement" /> 
     <xs:element name="Dog" type="AnimanlElement" /> 
    </xs:choice> 
</xs:complexType> 
<!-- AnimanlElement definition --> 
<xs:complexType name="AnimanlElement"> 
    <xs:attribute name="Name" type="xs:string" /> 
</xs:complexType> 

更多:http://www.w3schools.com/Schema/el_choice.asp

+0

是否有可能不明确地声明选择,只是说“我只需要任何AnimalElement中的一个”? – Ian

+0

@Ian编辑我的答案澄清。我意识到你在发布之后要求的东西比单纯的xs:choice更具体。 –

+0

这可能是一个考虑置换群体的好地方 –

相关问题