Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.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 XSD唯一元素XPath限制_Xml_Xpath_Xsd_Unique_Xsd 1.0 - Fatal编程技术网

Xml XSD唯一元素XPath限制

Xml XSD唯一元素XPath限制,xml,xpath,xsd,unique,xsd-1.0,Xml,Xpath,Xsd,Unique,Xsd 1.0,为了允许一个元素出现多次,但将其限制为只允许出现一次的元素值,我将应用unique元素。但是,由于XSD1.0中的XPath限制,我只能以低效的方式使用它。不幸的是,XSD1.1不是我的选择 以下是XSD的简化版本: <?xml version="1.0" encoding="utf-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">

为了允许一个元素出现多次,但将其限制为只允许出现一次的元素值,我将应用
unique
元素。但是,由于XSD1.0中的XPath限制,我只能以低效的方式使用它。不幸的是,XSD1.1不是我的选择

以下是XSD的简化版本:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">  
    <xs:simpleType name="DeliveryMethod">
        <xs:restriction base="xs:string">
            <xs:enumeration value="POST"/>
            <xs:enumeration value="DIGITALARCHIVE"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:complexType name="Mailpack">
        <xs:sequence>
            <xs:element maxOccurs="unbounded" name="deliveryMethod" type="DeliveryMethod"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="Letter">
        <xs:complexContent>
            <xs:extension base="Mailpack">
                <xs:sequence>
                    <xs:element name="content" type="xs:string"/>
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

    <xs:element name="batch">
        <xs:complexType>
            <xs:sequence>
                <xs:element minOccurs="0" name="id" type="xs:string"/>

                <xs:choice>
                    <xs:element maxOccurs="unbounded" name="letter" type="Letter">
                        <xs:unique name="oneOfEachDeliveryMethodType">
                            <xs:selector xpath="deliveryMethod"/>
                            <xs:field xpath="." />
                        </xs:unique>
                    </xs:element>
                </xs:choice>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>
将其作为批处理的一部分直接导致了相同的问题

如何只包含一次
unique
元素,但使其对
邮件包的所有扩展都有效?(如果有)

通过将
元素包装在一个(例如)
元素中,您可以移动
唯一的
元素,因此只需编写一次

例如,您只需将
Mailpack
complexType替换为以下内容:

<xs:complexType name="Mailpack">
    <xs:sequence>
        <xs:element name="deliveryMethodsList">
            <xs:complexType>
                <xs:sequence>
                    <xs:element maxOccurs="unbounded" name="deliveryMethod" type="DeliveryMethod"/>
                </xs:sequence>
            </xs:complexType>
            <!-- Unique is only placed here -->
            <xs:unique name="oneOfEachDeliveryMethodType">
                <xs:selector xpath="deliveryMethod"/>
                <xs:field xpath="." />
            </xs:unique>
        </xs:element>
    </xs:sequence>
</xs:complexType>
现在,以下示例无效,因为
DIGITALARCHIVE
出现两次:

<?xml version="1.0" encoding="utf-8"?>
<batch>
    <id>123</id>
    <letter>
        <deliveryMethodsList>
            <deliveryMethod>POST</deliveryMethod>
            <deliveryMethod>DIGITALARCHIVE</deliveryMethod>
            <deliveryMethod>DIGITALARCHIVE</deliveryMethod>
        </deliveryMethodsList>
        <content>Narf!</content>
    </letter>
</batch>

123
邮递
数字档案
数字档案
纳夫!

我想你不能使用XSD 1.1,是真的吗?@sergioFC:恐怕XSD 1.1不是一个选项,不。我很想使用它,但即使3年后一个基本应用程序仍然不支持它。我能想到的唯一替代方法是将列表包装在一个元素中。@sergioFC:这会有什么不同?在包含列表的元素中,您会将
unique
元素放在哪个位置。请注意,在我的回答中,我称之为。而不是。它就像一个符咒。通过将
deliveryMethod
元素包装在单独的元素中,而不是将它们直接“浮动”在
字母中,它甚至更干净。谢谢我很高兴它成功了。我不确定这是否符合你的需要。不客气。您介意通过将
DeliveryMethodsList
上的上限更改为
DeliveryMethodsList
来更正您自己的帖子吗?温和派拒绝了我的编辑,无效地说它没有提高它的准确性。现在正在使用不一致的样式和引用。当然,你是对的,现在它更好了,并且得到了纠正。
<xs:complexType name="Mailpack">
    <xs:sequence>
        <xs:element name="deliveryMethodsList">
            <xs:complexType>
                <xs:sequence>
                    <xs:element maxOccurs="unbounded" name="deliveryMethod" type="DeliveryMethod"/>
                </xs:sequence>
            </xs:complexType>
            <!-- Unique is only placed here -->
            <xs:unique name="oneOfEachDeliveryMethodType">
                <xs:selector xpath="deliveryMethod"/>
                <xs:field xpath="." />
            </xs:unique>
        </xs:element>
    </xs:sequence>
</xs:complexType>
<xs:element maxOccurs="unbounded" name="letter" type="Letter" />
<?xml version="1.0" encoding="utf-8"?>
<batch>
    <id>123</id>
    <letter>
        <deliveryMethodsList>
            <deliveryMethod>POST</deliveryMethod>
            <deliveryMethod>DIGITALARCHIVE</deliveryMethod>
            <deliveryMethod>DIGITALARCHIVE</deliveryMethod>
        </deliveryMethodsList>
        <content>Narf!</content>
    </letter>
</batch>