2011-08-04 62 views
0

我有METASXML架构验证使用案例

<?xml version="1.0" encoding="utf-8"?> 

<metas> 
<meta type="date"> 
    <code>storage_date</code> 
    <value>12-02-1989</value> 
</meta> 
<meta type="int"> 
    <code>weight</code> 
    <value>12</value> 
</meta> 
<meta type="bool"> 
    <code>foo</code> 
    <value>true</value> 
</meta> 
<meta type="text"> 
    <code>bar</code> 
    <value>Hello world</value> 
</meta>  
</metas> 

我想有模式,考虑到我的元类型,并根据它是否是一个int布尔日期或文字验证简单的XML格式。

到目前为止,我有

<?xml version="1.0" encoding="utf-8"?> 
<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <xsd:element name="metas" type="metasType" /> 
    <xsd:complexType name="metasType"> 
    <xsd:sequence> 
     <xsd:element maxOccurs="unbounded" name="meta" type="metaType" /> 
    </xsd:sequence> 
    </xsd:complexType> 

    <xsd:complexType name="metaType"> 
    ??? 
</xsd:schema> 

是什么,我试图做可能的模式验证?

回答

0

所以你想在meta元素上的type属性来控制meta元素的内容。要做到这一点的方法之一是:

  1. 让利元类型是空类型
  2. 每个可能性
  3. 有meta元素的类型属性是XSI创建一个新的类型由元类型扩展名:
  4. 类型
  5. type属性的值应该标识正在使用的metaType的实际子类型

Eg您将meta_int定义为metaType的子类型。当你在那里定义value元素时,它将是类型xs:int。然后,你将在你的XML:

<meta xsi:type="meta_int"> 
    <code>weight</code> 
    <value>12</value> 
</meta> 

另一种方法是使用不同的元素名称,而不是类型的属性(例如,一个meta_int元素)。然后可以使用选择组在各种meta_ *元素之间进行选择。

另一种方法可能是使用断言,但这是尚未正式发布的XSD 1.1的特性(AFAIK)。

我不确定你在做什么,但我认为可以公平地说,在XSD中,元素名称通常是控制随后内容最有用的东西,而您正在尝试使用属性。