2012-02-01 77 views
2

這是我的第一個問題在stackoverflow(我通常能夠找出我的問題,已經在這裏的答案)。XSD複雜枚舉

這是類似這些問題,但我想我的問題是有點不同(也XSD真的很難):

我想定義一組代表參數數據類型的「類型」。例如。

- Binary bit-mapped B/BM 1 byte 
    - Unsigned Integer  U/I  2 bytes 
    - Alphanumeric   ALPHA 1 byte 
    - etc... 

於是我想出了以下的xsd:

<xs:complexType name="parameterDataType" abstract="true"> 
    <xs:sequence> 
     <xs:element name="type" type="xs:string" /> 
     <xs:element name="abbreviation" type="xs:string" /> 
     <xs:element name="length" type="xs:positiveInteger" /> 
    </xs:sequence> 
</xs:complexType> 

<xs:complexType name="binaryBitMappedType"> 
    <xs:complexContent> 
     <xs:restriction base="parameterDataType"> 
      <xs:sequence> 
       <xs:element name="type" type="xs:string" fixed="Binary Bit-Mapped" /> 
       <xs:element name="abbreviation" type="xs:string" fixed="B/BM" /> 
       <xs:element name="length" type="xs:positiveInteger" fixed="1" /> 
      </xs:sequence> 
     </xs:restriction> 
    </xs:complexContent> 
</xs:complexType> 
etc... 

注意哦:我也試圖與一個序列和「類型,縮寫,長度」爲XS:屬性,所以如果這是一個更好的解決方案讓我知道。

這工作得很好,但它需要的XML元素重新定義他們的限制值(否則是無效的),有點像這樣:

<message> 
    <id>123</id> 
    <name>Some status type message</name> 
    <dataType xsi:type="binaryBitMappedType"> 
     <type>Binary Bit-Mapped</type> 
     <abbreviation>B/BM</abbreviation> 
     <length>1</length> 
    </dataType> 
    ...etc 
</message> 
<message> 
    <id>321</id> 
    <name>A DIFFERENT status type message</name> 
    <dataType xsi:type="binaryBitMappedType"> 
     <type>Binary Bit-Mapped</type> 
     <abbreviation>B/BM</abbreviation> 
     <length>1</length> 
    </dataType> 
    ...etc 
</message> 
<message> 
    <id>456</id> 
    <name>a continuous value type message</name> 
    <dataType xsi:type="unsignedIntegerType"> 
     <type>Unsigned Integer</type> 
     <abbreviation>U/I</abbreviation> 
     <length>2</length> 
    </dataType> 
    ...etc 
</message> 

有沒有一種方法,以避免重新定義這些XML中的值(可以將定義從XSD中提取出來,還是從XSD中提取?)或者,可以在自己的XML文件中提供定義,然後根據xsi:type來導入這些定義?

有點像這樣嗎?

<message> 
    <id>123</id> 
    <name>Some status type message</name> 
    <dataType xsi:type="binaryBitMappedType" /> <!-- don't have to repeat the dataType contents --> 
    ...etc 
</message> 
<message> 
    <id>321</id> 
    <name>A DIFFERENT status type message</name> 
    <dataType xsi:type="binaryBitMappedType" /> <!-- don't have to repeat the dataType contents --> 
    ...etc 
</message> 

還是我在隱藏到沒有?在此先感謝

回答

1

XSD 1.0中的一般規則是,您不能定義共約束:即一個元素的有效值完全獨立於任何其他元素的有效值。

在XSD 1.1中,您可以使用斷言來做你喜歡的事情。

+0

嗨,謝謝你的回答。我不知道斷言,看起來他們可能會解決這個問題。我已經稍微擴展了這個問題,試圖說明我試圖避免重複的部分。 – Doddie 2012-02-02 02:39:00