【问题标题】:Where to place xs:unique constraint in XSD?在 XSD 中放置 xs:unique 约束的位置?
【发布时间】:2015-05-14 05:29:46
【问题描述】:

我正在使用 XSD 进行 XML 验证。我想为 input 元素添加唯一值约束。

我有这样的 XML 格式:

<?xml version="1.0" encoding="UTF-8"?>
<test>
  <definitions>
    <input>Page</input>
  </definitions>
  <definitions>
    <input>Page</input>
  </definitions>
</test>

我的 XSD:

<xs:schema attributeFormDefault="unqualified" 
           elementFormDefault="qualified"
           xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="test">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="definitions" maxOccurs="unbounded" minOccurs="0">
          <xs:complexType>
            <xs:sequence>
              <xs:element type="xs:string" name="input"/>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

我想知道xs:unique应该如何放置。

【问题讨论】:

  • 如何放置唯一标签”是什么意思?此外,我在这里看不到任何属性。
  • 我在问如何为输入标签放置 标签,因为我不知道这一点
  • 目前还不清楚你想要什么是独一无二的。
  • 对不起,我会重新提出我的问题,我希望 标记的值是 unqiue。在我的 xml 中,“页面”值是重复的。所以我想为 添加唯一约束

标签: xml validation xsd xsd-validation


【解决方案1】:

放置xs:unique 元素:

  1. 确定元素的唯一性范围 (test) xs:unique/@selector (definitions)。
  2. 放置xs:unique 元素
    • test的声明中,以及
    • xs:complexType 之后为test

请参阅下面 XSD 中的 此处

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           elementFormDefault="qualified"
           attributeFormDefault="unqualified">
  <xs:element name="test">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="definitions"
                    maxOccurs="unbounded" minOccurs="0">
          <xs:complexType>
            <xs:sequence>
              <xs:element type="xs:string" name="input"/>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>

    <!-- HERE -->
    <xs:unique name="definitions-input-unique">
      <xs:selector xpath="definitions"/>
      <xs:field xpath="input"/>
    </xs:unique>

  </xs:element>
</xs:schema>

那么这个无效 XML

<?xml version="1.0" encoding="UTF-8"?>
<test>
  <definitions>
    <input>Page</input>
  </definitions>
  <definitions>
    <input>Page</input>
  </definitions>
</test>

将收到如下错误消息

[错误] try.xml:7:24: cvc-identity-constraint.4.1: Duplicate unique 为身份约束声明的值 [页面] 元素“test”的“definitions-input-unique”。

【讨论】:

    【解决方案2】:

    只要把它放在顶层,像这样:

    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
    	<xs:element name="test">
    		<xs:complexType>
    			<xs:sequence>
    				<xs:element name="definitions" maxOccurs="unbounded" minOccurs="0">
    					<xs:complexType>
    						<xs:sequence>
    							<xs:element type="xs:string" name="input"/>
    						</xs:sequence>
    					</xs:complexType>
    				</xs:element>
    			</xs:sequence>
    		</xs:complexType>
    		<xs:unique name="input-values">
    			<xs:selector xpath="./definitions"/>
    			<xs:field xpath="input"/>
    		</xs:unique>
    	</xs:element>
    </xs:schema>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-26
      • 2017-10-14
      相关资源
      最近更新 更多