2011-11-30 43 views
3

我需要搭建一個XSD模式來部分驗證文件。文件結構是:帶有未定義內容的XSD元素

<Root> 
    <Node name="core"> 
     <ElementA>String</ElementA> 
     <ElementB>String</ElementB> 
    </Node> 
    <Node name="something unique"> 
     (any number of elements, with unknown names and types) 
    </Node> 
</Root> 

我的XSD是一樣的東西:

<xs:element name="Root"> 
    <xs:complexType> 
     <xs:sequence maxOccurs="unbounded"> 
      <xs:element name="Node"> 
       <xs:complexType> 
        <xs:sequence> 
         <xs:element maxOccurs="unbounded" /> 
        </xs:sequence>       
        <xs:attribute name="name" type="xs:string" /> 
       </xs:complexType> 
      </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 

這是不完整和不完全正確的,未命名的<xs:element>是無效的。

有幾個節點是必需的,以及每個節點具有唯一的名稱屬性;這是我想驗證的。名稱列表和這些節點的內容是預定義的。

具有未知名稱的節點的內容也是未知的,並且可能包含具有任何名稱和類型的任意數量的元素,但它們本身不能具有屬性或值。

我遇到麻煩的部分是允許子元素不知道他們的名字。

是否有可能在XSD上做這樣的事情?有沒有辦法讓複雜類型的元素,或任何類型和屬性?

編輯:這將是可以被接受使用<Node>name S作爲元素類型,然後簡單地允許具有未知名稱的附加元件。無論哪種方式,我需要允許具有未知名稱和類型的節點。

回答

8

要允許「不知道名稱的子元素」,您可以使用xsd:any;將其添加爲特定(以「設計時間」爲準)內容後的重複粒子。

<?xml version="1.0" encoding="utf-8"?> 
<!--W3C Schema generated by QTAssistant/W3C Schema Refactoring Module (http://www.paschidev.com)--> 
<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <xsd:element name="Root"> 
    <xsd:complexType> 
     <xsd:sequence> 
     <xsd:element name="Node"> 
      <xsd:complexType> 
      <xsd:sequence> 
       <xsd:element name="ElementA" type="xsd:string" /> 
       <xsd:element name="ElementB" type="xsd:string" /> 
      </xsd:sequence> 
      <xsd:attribute name="name" type="xsd:string" use="required" /> 
      </xsd:complexType> 
     </xsd:element> 
     <xsd:element name="Extensions" minOccurs="0"> 
      <xsd:complexType> 
       <xsd:sequence> 
        <xsd:any maxOccurs="unbounded"  processContents="lax"/> 
       </xsd:sequence> 
       <xsd:anyAttribute processContents="lax"/> 
      </xsd:complexType> 
     </xsd:element> 
     </xsd:sequence> 
    </xsd:complexType> 
    </xsd:element> 
</xsd:schema> 
+0

因此,您建議區分必需元素和可選元素?在這種情況下,有兩個(或更多)名字? – ssube

+0

是的。但是,如果這是您的意思,則不必將xsd:any放在包裝元素下;然而,這是一種相當普遍的模式。有一件事我會做不同的,但是爲Extensions元素定義一個全局複合類型,以允許某個使用你的模式的人做他們自己的重定義,以防他們想要「強類型化」它。我只是想盡快告訴你如何xsd:任何人都可以按照我理解他們的方式來滿足你的要求。 –

相關問題