下面是xml,我需要创建一个xml格式(xsd文件)以验证字段名称,即在tableData节点(位于xml下方)中,第一列名称应为“ field”,关键字为“名称”,其值应为“ Data1”。我还想验证此列的值应为xs:integer类型(因为值是123)。 同样需要表的所有列。我是xml验证的新手,因此遇到了问题。
XML:
<table name="Employee">
<tableData>
<field name="Data1">123</field>
<field name="Data2">234</field>
<field name="Data3">Y</field>
<field name="Data4">321</field>
</tableData>
</table>
我尝试创建架构,但是未能验证123类型(即xs:integer)和其他列类型。请有人提供提示。
我尝试过的模式:
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="tableData" >
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="4" name="field" type="fieldType" minOccurs="4"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="fieldType">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="name" type="validAttributeType" use="required" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:simpleType name="validAttributeType">
<xs:restriction base="xs:string">
<xs:enumeration value="Data1"/>
<xs:enumeration value="Data2"/>
<xs:enumeration value="Data3"/>
<xs:enumeration value="Data4" />
</xs:restriction>
</xs:simpleType>
</schema>
此外,对于xml中的表名=“ Employee”(xml中的第一行),我试图创建一个架构并将其添加到上面提到的架构之前,但是这会产生错误:元素“表”不能包含子元素'tableData',因为父元素的内容模型仅是文本。我在上述架构之上添加的架构是:
<xs:element name="table" type="mTable"/>
<xs:complexType name="mTable" >
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="name" type="xs:string" fixed="Employee"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
答案 0 :(得分:0)
不幸的是,您选择将数据表示为<field name="data1">123</field>
而不是简单的<data1>123</data1>
,因为这使得为数据编写XSD模式非常困难。在XSD中,验证规则由元素名称决定。
有解决方法:
在XSD 1.1中,可以使用“条件类型分配”将类型分配给以其属性值为条件的元素。但是许多XSD处理器不支持XSD 1.1
您可以在验证数据之前将其转换为更简单的形式。但是,模式诊断将与转换后的文档有关,而不是原始文档。