gpt4 book ai didi

xml - 在定义的范围内强制 XML 属性的唯一性

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

我需要强制元素属性的唯一性,但仅限于父元素的范围内。这是一个有效的 XML 示例

<ns:Root
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ns="urn:Test.Namespace"
xsi:schemaLocation="urn:Test.Namespace Test1.xsd"
>
<ns:element1 id="001">
<ns:element2 id="001.1" order="1">
<ns:element3 id="001.1.1" />
</ns:element2>
<ns:element2 id="001.2" order="2">
<ns:element3 id="001.1.2" />
</ns:element2>
</ns:element1>
<ns:element1 id="002">
<ns:element2 id="002.1" order="1">
<ns:element3 id="002.1.1" />
</ns:element2>
<ns:element2 id="002.2" order="2">
<ns:element3 id="002.1.2" />
</ns:element2>
</ns:element1>
</ns:Root>

请注意,上面有两组“element1”,其中 element2 节点有一个名为“order”的属性。要求是“order”在父“element1”中必须是唯一的。例如,此简化版本将是无效的 XML

<ns:Root
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ns="urn:Test.Namespace"
xsi:schemaLocation="urn:Test.Namespace Test1.xsd"
>
<ns:element1 id="001">
<ns:element2 id="001.1" order="1">
<ns:element3 id="001.1.1" />
</ns:element2>
<ns:element2 id="001.2" order="1">
<ns:element3 id="001.1.2" />
</ns:element2>
</ns:element1>
</ns:Root>

我已经编写了以下架构来为我执行此操作;

<?xml version="1.0"?>

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="urn:Test.Namespace"
xmlns:ns="urn:Test.Namespace"
elementFormDefault="qualified">
<xsd:element name="Root">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="element1" maxOccurs="unbounded" type="ns:element1Type"/>
</xsd:sequence>
</xsd:complexType>
<xsd:unique name="uniqueElement2OrderInElement1">
<xsd:selector xpath="./ns:element1" />
<xsd:field xpath="ns:element2/@order" />
</xsd:unique>
</xsd:element>

<xsd:complexType name="element1Type">
<xsd:sequence>
<xsd:element name="element2" maxOccurs="unbounded" type="ns:element2Type"/>
</xsd:sequence>
<xsd:attribute name="id" type="xsd:string"/>
</xsd:complexType>

<xsd:complexType name="element2Type">
<xsd:sequence>
<xsd:element name="element3" type="ns:element3Type" />
</xsd:sequence>
<xsd:attribute name="id" type="xsd:string" />
<xsd:attribute name="order" type="xsd:string" />
</xsd:complexType>

<xsd:complexType name="element3Type">
<xsd:attribute name="id" type="xsd:string"/>
</xsd:complexType>
</xsd:schema>

这很接近,因为它确实强制唯一性,但在文档范围内。即每个订单属性必须是唯一的。我认为这是因为它被放置在 Root 的模式中,但我试图将它移动到更本地化的地方,或者使选择器更具体,但它不起作用(我收到错误)。

我想做的事情可行吗?

期待已久

最佳答案

据我所知,xsd:unique 约束的范围取决于您将其放置在哪个元素中。因此,如果您希望某些元素在给定元素 1 中是唯一的,则将它放在 element1 xsd:element block 中。

我尝试了您的示例(无可否认,在剥离命名空间之后),如果您移动 xsd:unique block 并如下更新 xpath,它应该可以工作。

<xsd:element name="Root">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="element1" maxOccurs="unbounded" type="ns:element1Type">
<xsd:unique name="uniqueElement2OrderInElement1">
<xsd:selector xpath="./ns:element2" />
<xsd:field xpath="@order" />
</xsd:unique>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>

关于xml - 在定义的范围内强制 XML 属性的唯一性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15663828/

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