Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 允许元素来自一个complexType和/或另一个complexType_Xml_Xsd_Enumeration_Complextype - Fatal编程技术网

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'))" />