2013-03-06 85 views
1

對於我正在使用的XSD,驗證的標記是有效的HTML。我試圖應用的規則應該能夠應用於任何HTML元素。換句話說,我的規則是元素不可知的。我主要關心限制屬性。元素不可知約束?

<xs:element name="div"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:any> 
        <xs:attribute name="containerColor"> 
         <xs:simpleType> 
          <xs:restriction base="xs:string"> 
           <xs:enumeration value="green"/> 
           <xs:enumeration value="red"/> 
           <xs:enumeration value="blue"/> 
           <xs:enumeration value="yellow"/> 
           <xs:enumeration value="grey"/> 
           <xs:enumeration value="black"/> 
          </xs:restriction> 
         </xs:simpleType> 
        </xs:attribute> 
        <xs:unique name="id" > 
         <xs:selector xpath="*"></xs:selector> 
         <xs:field xpath="*"></xs:field> 
        </xs:unique> 
       </xs:any> 
      </xs:sequence> 
    </xs:complexType> 
</xs:element> 

我是新來的XSD。我相信我有一些根本性的誤解。

  • 在上面的例子我想說任何可以(但不要求有)一個「containerColor」屬性。如果使用該屬性,則必須是枚舉顏色之一。

  • 此外,任何元素都可以有一個ID,它應該是唯一的。

在上面的嘗試,我得到投訴的任何元素不是屬性/唯一一個有效的上下文。

從選擇器的角度來看,我關心的是將規則應用於所有元素的集合而不是特定的元素。有沒有一種方法可以用XSD實現這一點?

回答

1

您是否可以編寫XSD架構來執行您想要的操作取決於您要約束的文檔的多少以及您是否有任何相關元素命名的自由。

在通常情況下,由於屬性很少適用於所有元素,所以屬性被聲明爲與特定的複雜類型相關聯(因此與特定元素間接相關)。 (例如:當它出現在HTML頭和meta元素上時,是否有一個名爲containerColor的屬性有意義?那麼它是什麼意思?)

但是XSD支持頂層屬性的聲明。以下XSD架構聲明名稱爲idcontainerColor的屬性不在任何名稱空間中。

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

    <xs:attribute name="containerColor"> 
    <xs:simpleType> 
     <xs:restriction base="xs:string"> 
     <xs:enumeration value="green"/> 
     <xs:enumeration value="red"/> 
     <xs:enumeration value="blue"/> 
     <xs:enumeration value="yellow"/> 
     <xs:enumeration value="grey"/> 
     <xs:enumeration value="black"/> 
     </xs:restriction> 
    </xs:simpleType> 
    </xs:attribute> 

    <xs:attribute name="id" type="xs:ID"/> 

</xs:schema> 

它們是頂級屬性,不綁定到特定元素。所以原則上你可以把這個模式交給一個XSD驗證器,請求它掃描文檔,接受沒有XSD聲明的所有內容並驗證它有聲明的所有內容。 (XSD規範將此稱爲「寬鬆驗證」。)唯一的聲明是你的兩個屬性,所以它會驗證它們並且通過其他所有的東西。其效果是您所聲明的屬性在所有元素上都是允許的,並在出現的任何地方進行驗證。

這裏的主要問題是XSD不會試圖規範甚至定義驗證器與外部世界之間的接口,也不能保證聲明符合規範的給定驗證器將允許您使用此類規範調用它一個要求。 (另一方面,對於許多XSD驗證程序,從文檔元素開始的鬆散驗證是默認操作模式,有時是唯一可以獲得的操作模式,所以這可能適用於您正在使用的任何驗證程序。)

另一種方法是爲XHTML製作XSD架構文檔的本地副本,並將您的屬性添加到應該能夠承載它們的所有元素。 XSD 1.1有一些應該使這個任務更容易的構造。

1

不,你想要的東西不能用XSD通配符來表達。 This link提供了一個視圖,您可以使用XSD 1.0中的xsd:any particle和XSD 1.1中的this one做什麼。基本上,你可以嵌套的唯一東西是一個註釋。

如果您確實需要,您必須使用其他模式語言。放鬆NG是模式語言(我知道的)中唯一可以通過使用通用名稱類< anyName>爲<元素>很容易地做到的事情。然而,它不(我相信)處理唯一性 - 你必須依靠xsd:ID數據類型。

至於唯一性和Schematron,have a look at this,也在SO上。如果XSD 1.1是一個選項,那麼您至少可以替換Schematron部件。