【问题标题】:Unique element value in xml via xsd通过 xsd 在 xml 中的唯一元素值
【发布时间】:2017-07-27 18:36:17
【问题描述】:

我有一个 xsd,它必须防止元素的重复值。我尝试了各种方法,但不知何故缺少实现元素的唯一约束。

在下面的 xml 中,我的 xyz:interval 元素具有重复值。 如何避免使用唯一标签的重复?

我尝试在下面的 XSD 中使用 unique,但无法实现。

XSD:

<?xml version="1.0" encoding="utf-8" ?>
<xs:schema xmlns:xyz="http://www.example.com/schema/public/" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://www.example.com/schema/public/" version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType name="Intervals">
    <xs:sequence>
        <xs:element name="interval" type="xs:int" maxOccurs="unbounded">
            <xs:unique name="alias_unique">
                <xs:selector xpath="supportedMeasurementIntervals" />
                <xs:field xpath="." />
            </xs:unique>
        </xs:element>
        <xs:element name="defaultInterval" type="xs:int" minOccurs="1" maxOccurs="1" />
    </xs:sequence>
</xs:complexType>
<xs:element name="NoOfPeriod" type="xs:int" />
<xs:element name="isPeriodSupported" type="xs:boolean" />
<xs:element name="MType">
    <xs:complexType mixed="true">
        <xs:sequence minOccurs="0">
            <xs:element name="SIntervals" type="xyz:Intervals" minOccurs="0" maxOccurs="1" />
        </xs:sequence>
        <xs:attribute name="id" type="xs:string" use="required" />
    </xs:complexType>
</xs:element>
<xs:group name="Child">
    <xs:sequence>
        <xs:element name="SIntervals" type="xyz:Intervals" minOccurs="1" maxOccurs="1" />
        <xs:element ref="xyz:NoOfPeriod" minOccurs="1" maxOccurs="1" />
        <xs:element ref="xyz:isPeriodSupported" minOccurs="1" maxOccurs="1" />
    </xs:sequence>
</xs:group>
<xs:element name="Parent">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="Child" minOccurs="1" maxOccurs="1">
                <xs:complexType>
                    <xs:group ref="xyz:Child" />
                </xs:complexType>
            </xs:element>
            <xs:element name="MTypes" minOccurs="1" maxOccurs="1">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element ref="xyz:MType" maxOccurs="unbounded" />
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>
</xs:element>
</xs:schema>

XML:

<?xml version="1.0" encoding="utf-8"?>
<xyz:Parent xmlns:xyz="http://www.example.com/schema/public/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.com/schema/public/">
    <xyz:Child>
        <xyz:SIntervals>
            <xyz:interval>1111</xyz:interval>
            <xyz:interval>1111</xyz:interval>
            <xyz:interval>1111</xyz:interval>
            <xyz:interval>9727</xyz:interval>
            <xyz:defaultInterval>504</xyz:defaultInterval>
        </xyz:SIntervals>
        <xyz:NoOfPeriod>4804</xyz:NoOfPeriod>
        <xyz:isPeriodSupported>1</xyz:isPeriodSupported>
    </xyz:Child>
    <xyz:MTypes>
        <xyz:MType id="string" />
        <xyz:MType id="string" />
        <xyz:MType id="string">
            <xyz:SIntervals>
                <xyz:interval>2222</xyz:interval>
                <xyz:interval>2222</xyz:interval>
                <xyz:defaultInterval>6631</xyz:defaultInterval>
            </xyz:SIntervals>
        </xyz:MType>
        <xyz:MType id="string" />
    </xyz:MTypes>
</xyz:Parent>

【问题讨论】:

    标签: xml xsd xsd-validation unique-constraint xml-validation


    【解决方案1】:

    实际上,您可以在 Intervals 的定义中更改 maxOccurs="1" 而不是“unbounded”。

        [.....]
        <xs:complexType name="Intervals">
            <xs:sequence>
                  <xs:element name="interval" type="xs:int" maxOccurs="1">
        [.....]
    

    编辑(评论后)

    1. 您必须将您定义的命名空间放入 xpath 表达式中。
    2. 正如评论中所说,unique 适用于element 的范围。你定义的级别太低了。

    例如,您可以在Child 元素的范围内定义唯一性,如下所示:

    <xs:group name="Child">
    <xs:sequence>
        <xs:element name="SIntervals" type="xyz:Intervals" minOccurs="1" maxOccurs="1" >
            <xs:unique name="uniqueInterval">
                <xs:selector xpath="xyz:interval" />
                <xs:field xpath="." />
            </xs:unique>
        </xs:element>
        <xs:element ref="xyz:NoOfPeriod" minOccurs="1" maxOccurs="1" />
        <xs:element ref="xyz:isPeriodSupported" minOccurs="1" maxOccurs="1" />
    </xs:sequence>
    

    然后你必须对你的其他元素做同样的事情(或者你重新设计定义)。

    【讨论】:

    • 我可以有多个区间定义,但它们的值不能相同。如果值重复,xsd 应该无法通过验证。
    • 好的,我没有正确回答问题。 unique 应用于元素的范围,但是在这里,您想将其应用于 complexType,这是不可能的,请参阅stackoverflow.com/questions/32826828/…。也许你必须重新设计你的 xsd 和类型的定义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-06
    • 2011-05-06
    • 1970-01-01
    • 2013-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多