2012-11-07 131 views
1

我已经经历了许多网站,然后创建了Xml架构,其中的其他属性取决于其中一个属性的值。XML验证不验证基于另一个属性的属性

如下XML文件:

<?xml version="1.0"?> 
<Main> 
    <Matter kind="fruits" calories="10" name="apple" quantity="10" color="red"/> 
    <Matter kind="car" brand="ford" name="ikon" quantity="1" color="red"/> 
    <Matter kind="country" continent="Asia" name="japan"/> 
</Main> 

那种属性可以有水果,汽车和国家。并根据属性需要其他参数,如国家值,所需的大陆属性。

和下面的是XSD文件,

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> 
    <xs:element name="Main"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element maxOccurs="unbounded" ref="Matter"/> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
    <xs:element name="Matter"> 
    <xs:complexType> 
     <xs:attribute name="name" use="required" type="xs:NCName"/> 
     <xs:alt cond="@kind='fruits'"> 
     <xs:attribute name="kind" use="required" type="xs:NCName" fixed="fruits"/> 
     <xs:attribute name="color" type="xs:NCName"/> 
     <xs:attribute name="quantity" type="xs:integer"/> 
     </xs:alt> 
     <xs:alt cond="@kind='car'"> 
     <xs:attribute name="kind" use="required" type="xs:NCName" fixed="car"/> 
     <xs:attribute name="brand" type="xs:NCName"/> 
     <xs:attribute name="quantity" type="xs:integer"/> 
     <xs:attribute name="color" type="xs:NCName"/> 
     </xs:alt> 
     <xs:alt cond="@kind='country'"> 
     <xs:attribute name="kind" use="required" type="xs:NCName" fixed="country"/> 
     <xs:attribute name="continent" type="xs:NCName" use="required"/> 
     </xs:alt> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 

当我确认上述XSD的XML文件,我得到的错误“元素ALT是无效的,错位,或过于频繁地发生。

请帮我确认上述文件,在适当的XSD

+2

xs:alt不是有效的Xsd构造。 Xsd不会根据文档的内容进行验证,它只允许验证“形状”。我认为xs:alt可能是模式的扩展,如果是这种情况,您需要使用能够理解如何处理它的验证器。开箱即用,您的文档不是有效的模式,因为它使用的是未在XSD中定义的结构(关键字)。 – Pawel

回答

1

我不知道你在哪里得到了XSL的想法:?ALT从XML模式或许有些专有扩展

XSD 1.1标准有一个称为条件类型赋值的设施,有点像这样,它带有一个名为xs:alternative的元素。最近版本的Xerces和Saxon支持XSD 1.1。

+0

我认为,通过XSD无法实现属性条件检查,指向DSD http://cs.au.dk/~amoeller/XML/schemas/dsd-example.html。 – Ayush

+0

有很多验证技术可用。 DSD是我没有遇到过的。如果您没有致力于XSD路线,首先看的地方是Relax NG。 –

0

我想你应该使用xs:extension如下。 这是一个示例XML:

<?xml version="1.0" encoding="UTF-8"?> 
<Main xmlns="http://www.example.com/matters"> 
    <Fruit calories="10" name="apple" quantity="10" color="red"/> 
    <Car brand="ford" name="ikon" quantity="1" color="red"/> 
    <Car brand="dodge" name="fire" quantity="1" color="blue"/> 
    <Country continent="Asia" name="Japan"/> 
    <Country continent="Europe" name="Italy"/> 
</Main> 

这是此XML的XSD。唯一的限制是相同类型的元素应该按顺序分组。 您也可以添加固定属性,但由于标签的名称表示类型,所以我没有发现它们是必需的。

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema targetNamespace="http://www.example.com/matters" xmlns="http://www.example.com/matters" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> 
    <!-- document structure --> 
    <xs:element name="Main"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="Fruit" type="fruitType" minOccurs="0" maxOccurs="unbounded" /> 
       <xs:element name="Car" type="carType" minOccurs="0" maxOccurs="unbounded" /> 
       <xs:element name="Country" type="countryType" minOccurs="0" maxOccurs="unbounded" /> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
    <!-- types definitions --> 
    <xs:complexType name="matterType"> 
     <xs:attribute name="name" use="required" type="xs:NCName"/> 
    </xs:complexType> 
    <xs:complexType name="fruitType"> 
     <xs:complexContent> 
      <xs:extension base="matterType"> 
       <xs:attribute name="color" type="xs:NCName"/> 
       <xs:attribute name="quantity" type="xs:integer"/> 
       <xs:attribute name="calories" type="xs:integer"/> 
      </xs:extension> 
     </xs:complexContent> 
    </xs:complexType> 
    <xs:complexType name="carType"> 
     <xs:complexContent> 
      <xs:extension base="matterType"> 
       <xs:attribute name="brand" type="xs:NCName"/> 
       <xs:attribute name="quantity" type="xs:integer"/> 
       <xs:attribute name="color" type="xs:NCName"/> 
      </xs:extension> 
     </xs:complexContent> 
    </xs:complexType> 
    <xs:complexType name="countryType"> 
     <xs:complexContent> 
      <xs:extension base="matterType"> 
       <xs:attribute name="continent" type="xs:NCName" use="required"/> 
      </xs:extension> 
     </xs:complexContent> 
    </xs:complexType> 
</xs:schema> 
0

看起来您正在尝试创建另一种类型。我认为你应该用自己的规则重构并创建新的类型。然后你可以继续使用你原来的修改过的xsd和解析。

<?xml version="1.0"?> 
<Main> 
    <fruits calories="10" name="apple" quantity="10" color="red"/> 
    <car brand="ford" name="ikon" quantity="1" color="red"/> 
    <country continent="Asia" name="japan"/> 
</Main>