簡體   English   中英

通過XSD在XML中的唯一元素值

[英]Unique element value in xml via xsd

我有一個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>

實際上,您可以在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>

然后,您必須對其他元素執行相同的操作(或重新設計定義)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM