Xml 允许元素来自一个complexType和/或另一个complexType
我有一个元素Xml 允许元素来自一个complexType和/或另一个complexType,xml,xsd,enumeration,complextype,Xml,Xsd,Enumeration,Complextype,我有一个元素标记,它有一个复杂类型,由名称、运算符和值组成; 其中,name是“流派”、“唱片集”或“艺术家”(简化)之一,应允许以下运算符:“等于”、“CS”(包含)或“SW”(开始)(简化) 现在有了带有名称的标记“YEAR”,它具有整数值,而不是字符串,因此应该只允许运算符“LT”(较小)和“GT”(较大)(简化) 我无法将此条件构建到现有XSD中,因为一个元素中不允许有多个complexType。因此,我可以在java例程中处理冲突时首先捕获冲突,这有点晚了。我希望XML验证器尽早“呼出
标记
,它有一个复杂类型,由名称
、运算符
和值
组成;
其中,name
是“流派”、“唱片集”或“艺术家”(简化)之一,应允许以下运算符:“等于”、“CS”(包含)或“SW”(开始)(简化)
现在有了带有名称的标记
“YEAR”,它具有整数值,而不是字符串,因此应该只允许运算符“LT”(较小)和“GT”(较大)(简化)
我无法将此条件构建到现有XSD中,因为一个元素中不允许有多个complexType。因此,我可以在java例程中处理冲突时首先捕获冲突,这有点晚了。我希望XML验证器尽早“呼出”格式错误的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>
专辑
反恐精英
这个
年
书信电报
2010
专辑
燃气轮机
这个
年
反恐精英
2010
我希望我的问题对您来说是可以理解的,您可以帮助我找到一个合适的解决方案-提前感谢 您应该知道,只有使用XSD-1.1才能实现这一点,因为需要xs:assert
函数。因此,要使用值为YEAR
的名称子项限制标记元素,必须在
定义的相应
元素后设置此限制:
<xs:assert test="name!='YEAR' or (name='YEAR' and value castable as xs:integer and (operator='LT' or operator='GT'))" />
限制
元素的另一种方法是
<xs:assert test="(name!='YEAR' and (operator!='LT' or operator!='GT')) or (name='YEAR' and value castable as xs:integer and (operator='LT' or operator='GT'))" />
它还将操作员LT
和GT
排除在除YEAR
之外的所有元素中,感谢您快速而有启发性的回答!虽然我已经更改为“1.1”版本,但验证器仍然不断地说“元素‘assert’无效、错位或发生得太频繁”。我认为,也缺少了一些“$”,但这似乎不是真正的问题,因为键入“不幸的是,Eclipse(2019-3)似乎无法处理XML模式版本1.1-仅1.0:-(那么您的限制可能不太好。
<xs:assert test="(name!='YEAR' and (operator!='LT' or operator!='GT')) or (name='YEAR' and value castable as xs:integer and (operator='LT' or operator='GT'))" />