簡體   English   中英

構建需要元素或屬性(但不是全部)的XML模式

[英]Build XML schema that requires element or attribute, but not both

我想創建一個具有以下約束的XML模式:

  • 根元素應為list
  • list包含一組node元素。
  • node元素可以具有value屬性。
  • node元素可以包含value元素。
  • 一個node元素只能(並且恰好 )具有一個value屬性或value元素。

這是驗證上述約束的有效XML的示例:

<?xml version="1.0" ?>
<list>
    <node id="1" value="A" />
    <node id="2">
        <value>B</value>
    </node>
</list>

我嘗試了以下XSD架構:

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="list">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="node" maxOccurs="unbounded" minOccurs="0">
          <xs:complexType mixed="true">
            <xs:sequence>
              <xs:element type="xs:string" name="value" minOccurs="0"/>
            </xs:sequence>
            <xs:attribute type="xs:byte" name="id" use="optional"/>
            <xs:attribute type="xs:string" name="value" use="optional"/>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

這個XSD模式驗證了我的第一個和第二個約束,但沒有驗證第三個約束。

根據我的約束,以下XML示例無效,但是,對於我以前的XSD模式而言,它是有效的。

<?xml version="1.0" ?>
<list>
    <node id="2" value="A" /> <!-- valid -->
    <node id="4">
        <value>D</value>
    </node><!-- valid -->
    <node id="1" /><!-- not valid, missing value -->
    <node id="3" value="B">
        <value>C</value>
    </node><!-- not valid, both attribute and element are declared -->
</list>

如何更改架構以驗證所有約束?

提前致謝。

使用XSD 1.0不可能做到這一點。

使用斷言的XSD 1.1應該應該是可能的:

<xs:assert test="not(@value and value)"/>

如果@valuevalue都存在,則失敗。 要檢查是否只有一個屬性或子元素,請使用:

<xs:assert test="count((value, @value))=1"/>

正如邁克爾·凱(Michael Kay)在評論中建議的那樣。

使用其他一些XML驗證技術(例如Schematron)可能是可能的。

您可以使用必需的屬性創建第一種類型,並使用必需的元素創建第二種類型。 然后使用包含兩種類型的選擇合成器。

暫無
暫無

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

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