gpt4 book ai didi

xml - XSD 唯一元素 XPath 限制

转载 作者:数据小太阳 更新时间:2023-10-29 02:34:39 26 4
gpt4 key购买 nike

为了允许一个元素出现多次但将其限制为只允许出现一次的元素值,我应用了 unique 元素。不过,由于 XSD 1.0 中的 XPath 限制,我只是让它以低效的方式工作。不幸的是,XSD 1.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>

使用以下 XML:

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

这按预期工作,并给出了“DIGITALARCHIVE”被包含两次的错误。问题是这种方法迫使我在每个可能的扩展 Mailpack 类型中包含 unique 元素。所以如果我例如引入 Parcel 类型作为 Mailpack 的扩展,然后我必须从 batch/letter 复制相同的 unique 元素> 新的 batch/parcel 元素中的元素。

使 unique 元素成为 deliveryMethod 元素的一部分不是一个选项,因为 XSD 中不允许使用 .. 父选择器XPath。

<xs:complexType name="Mailpack">
<xs:sequence>
<xs:element maxOccurs="unbounded" name="deliveryMethod" type="DeliveryMethod">
<xs:unique name="oneOfEachDeliveryMethodType">
<xs:selector xpath="deliveryMethod"/>
<xs:field xpath=".." />
</xs:unique>
</xs:element>
</xs:sequence>
</xs:complexType>

将其作为 batch 元素的一部分直接导致了同样的问题。

我怎样才能只包含一次 unique 元素,但让它对 Mailpack 的所有扩展都有效? (如果有的话)

最佳答案

通过包装 <deliveryMethod> a 中的元素(例如)<deliveryMethodsList>您可以移动元素 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>

现在您不需要 unique letters 列表中的元素:

<xs:element maxOccurs="unbounded" name="letter" type="Letter" />

现在下面的例子是无效的 <deliveryMethod>DIGITALARCHIVE</deliveryMethod>出现两次:

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

关于xml - XSD 唯一元素 XPath 限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30759415/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com