允许元素来自一个complexType和/或另一个

我有一个元素tag,它的复杂类型由nameoperatorvalue组成; 其中name是“ GENRE”,“ ALBUM”或“ ARTIST”之一(简化),并且应允许以下operators:“ EQ”(等于),“ CS”(包含)或“ SW” “(startsWith)(简体)。

现在有一个tagname“ 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>

我希望我的问题对您可以理解,您可以通过合适的解决方案帮助我-预先感谢!

hustsky012 回答:允许元素来自一个complexType和/或另一个

您应该知道只能使用XSD-1.1来实现,因为需要xs:assert函数。因此,要限制tag元素的值为name的{​​{1}}子元素,您必须在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>子元素的值为“ YEAR”的元素,以及那些<name>子元素的值为“ YEAR”的元素类型为<name>的{​​{1}}和值为{LT“或” GT“的<value>子级。在这种情况下,请小心使用AND / OR,因为所有声明的断言都必须为 xs:integer,因此<operator>也是如此。

您完整的XSD文件可能如下所示:

<tag>

限制or元素的另一种方法是

<?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>

它还从<tag>之外的所有元素中排除了运算符<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

本文链接:https://www.f2er.com/3045521.html

大家都在问