我有一个元素tag
,它具有由name
,operator
和value
组成的复杂类型;其中name
是“ GENRE”,“ ALBUM”或“ ARTIST”之一(简化),并且应允许以下operators
:“ EQ”(等于),“ CS”(包含)或“ SW”(startsWith) (简体)。
[现在有tag
和name
“ YEAR”具有整数值,而不是其他所有值的String,因此应只允许使用运算符“ LT”(较少)和“ GT”(较大)(简化) 。
我无法将此条件构建到我现有的XSD中,因为不允许在一个元素中包含多个complexType。因此,在Java例程中处理冲突时,我可以先捕获冲突,这有点晚了。我希望XML-Validator尽早“呼出”格式错误的XML。
这里是我的XSD模式的摘录:
<xs:element name="tags" minOccurs="0" maxOccurs="1">
<xs:complexType>
<xs:sequence>
<xs:element name="tag" minOccurs="1" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence minOccurs="1" maxOccurs="unbounded">
<xs:element name="name" minOccurs="1" maxOccurs="1">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="PLAYLISTS" />
<xs:enumeration value="GENRE" />
<xs:enumeration value="ALBUM" />
<xs:enumeration value="ARTIST" />
<xs:enumeration value="ALBUM_ARTIST" />
<xs:enumeration value="YEAR" />
<xs:enumeration value="TITLE" />
<xs:enumeration value="COMMENT" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="operator" minOccurs="1" maxOccurs="1">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="EQ" />
<xs:enumeration value="CS" />
<xs:enumeration value="SW" />
<xs:enumeration value="EW" />
<xs:enumeration value="LT" />
<xs:enumeration value="GT" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element type="xs:string" name="value" minOccurs="1" maxOccurs="1" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
这里是XML的样本摘录,其中前两个标记元素应该有效,而后两个标记元素应该无效。因为分别将整数运算符用于字符串值,所以将字符串运算符用于int值。
<tags>
<tag>
<name>ALBUM</name>
<operator>CS</operator>
<value>The</value>
</tag>
<tag>
<name>YEAR</name>
<operator>LT</operator>
<value>2010</value>
</tag>
<tag>
<name>ALBUM</name>
<operator>GT</operator>
<value>The</value>
</tag>
<tag>
<name>YEAR</name>
<operator>CS</operator>
<value>2010</value>
</tag>
</tags>
我希望我的问题对您可以理解,您可以通过合适的解决方案为我提供帮助-预先感谢!
您应该知道,您只能使用XSD-1.1来实现这一点,因为需要xs:assert
功能。因此,要使用值为tag
的name
子元素来限制YEAR
元素,必须在</xs:sequence>
定义的相应<tag>
元素之后设置此限制:
<xs:assert test="name!='YEAR' or (name='YEAR' and value castable as xs:integer and (operator='LT' or operator='GT'))" />
此断言将您的<tag>
元素限制为那些<name>
子元素的值为“ YEAR”,并且其<name>
子元素的值为“ YEAR”且其<value>
为键入xs:integer
和值为[LT]或“ GT”的<operator>
子级。在这种情况下,请小心AND / OR,因为所有断言都必须为TRUE<tag>
s,因此or
。
您完整的XSD文件可能看起来像这样:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.1">
<xs:element name="tags">
<xs:complexType>
<xs:sequence>
<xs:element name="tag" minOccurs="1" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence minOccurs="1" maxOccurs="unbounded">
<xs:element name="name" minOccurs="1" maxOccurs="1">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="PLAYLISTS" />
<xs:enumeration value="GENRE" />
<xs:enumeration value="ALBUM" />
<xs:enumeration value="ARTIST" />
<xs:enumeration value="ALBUM_ARTIST" />
<xs:enumeration value="YEAR" />
<xs:enumeration value="TITLE" />
<xs:enumeration value="COMMENT" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="operator" minOccurs="1" maxOccurs="1">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="EQ" />
<xs:enumeration value="CS" />
<xs:enumeration value="SW" />
<xs:enumeration value="EW" />
<xs:enumeration value="LT" />
<xs:enumeration value="GT" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element type="xs:string" name="value" minOccurs="1" maxOccurs="1" />
</xs:sequence>
<xs:assert test="name!='YEAR' or (name='YEAR' and value castable as xs:integer and (operator='LT' or operator='GT'))" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>