我有一个简单的xml,
<?xml version="1.0" encoding="UTF-8"?>
<Metadata>
<Data Name="Title" Value="This is a new title." />
<Data Name="Licensing_Window_Start" Value="2016-09-01" />
<Data Name="Licensing_Window_End" Value="2016-09-14" />
<Data Name="Preview_Period" Value="60" />
</Metadata>
我可以像上面这样在xml上生成xsd,
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Metadata">
<xs:complexType>
<xs:sequence>
<xs:element name="Data" maxOccurs="unbounded" minOccurs="0">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute type="xs:string" name="Name" use="required"/>
<xs:attribute type="xs:string" name="Value" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
但我要验证的是,对于<Data>
标记,对于属性Name
,值Title
是必需的,需要为{的值定义minlength和maxlength {1}}。
是否可以使用我上面提到的验证类型创建xsd?
答案 0 :(得分:2)
是的,它可能,但它可能取决于您正在使用的XML Schema版本。
属性名称标题为必填项
使用XSD 1.0无法实现,但使用XSD 1.1可以依赖断言(<xs:assert>
):
<xs:assert test="Data[@Name = 'Title']"/>
可以添加到定义complexType
的内容模型的<Metadata>
中;如果找不到<Data>
Name="Title"
,则会引发错误。
设置'Value'
您需要定义并使用带有<xs:restriction>
的类型(即使您还可以将以下代码段嵌入<xs:attribute name="Value">
的子代中:
<xs:simpleType name="value-attr">
<xs:restriction base="xs:string">
<xs:minLength value="1"/>
<xs:maxLength value="200"/>
</xs:restriction>
</xs:simpleType>
并更改您的属性声明,如下所示:
<xs:attribute type="value-attr" name="Value" use="required"/>
最后,您将得到以下架构:
<?xml version="1.0"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" vc:minVersion="1.1">
<xs:element name="Metadata">
<xs:complexType>
<xs:sequence>
<xs:element name="Data" maxOccurs="unbounded" minOccurs="0">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute type="xs:string" name="Name" use="required"/>
<xs:attribute type="value-attr" name="Value" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:assert test="Data[@Name = 'Title']"/>
</xs:complexType>
</xs:element>
<xs:simpleType name="value-attr">
<xs:restriction base="xs:string">
<xs:minLength value="1"/>
<xs:maxLength value="200"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>
答案 1 :(得分:1)
请参阅@ potame的回答(+1)。
不可能,但如果使用较少的抽象元素名称,
<?xml version="1.0" encoding="UTF-8"?>
<Metadata>
<Title>This is a new title.</Title>
<Licensing_Window_Start>2016-09-01</Licensing_Window_Start>
<Licensing_Window_End>2016-09-14</Licensing_Window_End>
<Preview_Period>60</Preview_Period>
</Metadata>
表示Title
是强制性的(以及您的minLength
和maxLength
约束)将是微不足道的。