簡體   English   中英

XML Schema可以指定共現約束嗎?

[英]Can XML Schema specify co-occurrence constraints?

XML Schema文檔是否可以指定必須同時出現兩個項目?

例如,有兩個可選元素,它們要么都存在,要么都不存在。

a b? c d? e      # giving only {ace, abcde}
                 # instead of all combinations: {ace, acde, abce, abcde}

<element name="root">
  <complexType>
    <sequence>
      <element ref="a"/>
      <element ref="b" minOccurs="0"/>
      <element ref="c"/>
      <element ref="d" minOccurs="0"/>
      <element ref="e"/>
    <sequence>
  <complexType>
<element>

另一個例子:有兩個重復的元素,並且不管第一個元素發生多少次,第二個元素也發生多次:

a b^n c d^n e  # where ^n is a superscript denoting number of repeats
               # giving {ace, abcde, abbcdde, abbbcddde, ...}
               # but no other combinations

<element name="root">
  <complexType>
    <sequence>
      <element ref="a"/>
      <element ref="b" minOccurs="0" maxOccurs="unbounded"/>
      <element ref="c"/>
      <element ref="d" minOccurs="0" maxOccurs="unbounded"/>
      <element ref="e"/>
    <sequence>
  <complexType>
<element>

XML Schema規范中的身份約束中可能有某些內容,但這似乎是要獲取具有特定特征的一個實例,而不是確保兩個實例具有相同的特征。

共存是現有的1.0 Schema規范無法解決的問題之一。 這是Schematron發布的原因之一。 基於斷言的驗證可以處理這種情況,以及可以通過XPath Express表達的其他任何情況,都非常容易。

此外,在1.1 Schema 規范中有斷言功能,但是我還不知道處理器對1.1的廣泛支持。

基於斷言的驗證的典型示例通常圍繞信用卡交易,例如:

<card>
  <number>1111-1111-1111</number>
  <type>mastercard</type>
</card>

在這里,我們要確保萬事達卡號碼以“ 1”開頭,簽證以“ 2”開頭(當然不是真正的慣例)。 使用Schema 1.0無法做到這一點,但是通過斷言(用偽代碼)相當容易

<assert test="starts-with(card/type[.='mastercard'],'1')"/>

不確定直接執行此操作的能力。 不過,一個簡單的選擇是將它們嵌入單個可選元素中,並要求新元素中的每個元素。 類似於以下內容:

<element name="root">
  <complexType>
    <sequence>
      <element ref="a"/>
      <element ref="c"/>
      <element ref="f" minOccurs="0">
        <complexType>
          <element ref="b" minOccurs="1"/>
          <element ref="d" minOccurs="1"/>
        </complexType>
      </element>
      <element ref="e"/>
    </sequence>
  </complexType>
</element>

暫無
暫無

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

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