2012-07-26 30 views
1

是否可以定義可以是keyref或數字文字的類型?就像在任何類型的編程語言中一樣,您可以將數字文字或其他變量的名稱分配給數字變量。我正在制定一個模式來定義繪圖API元素(用於另一種編程語言),並且希望定義一個類型爲color的類型,該類型可以是十六進制文字(例如,用於鮮紅色的0xFF0000),也可以是對其他位置定義的顏色的引用。所以,你可以做(​​在XML文檔):XSD keyref或數字文字

<color key="dialogBorder1">0x222222</color> 
<color key="dialogFill1">0xCCCCCC</color> 

<!-- later... --> 
<windowTheme name="warningWindow"> 
    <border> 
    <color>0xFF0000</color> <!-- defined literally --> 
    </border> 
    <fill> 
    <solid> 
     <color>dialogFill1</color> <!-- defined by keyref --> 
    </solid> 
    </fill> 
</windowTheme> 

如果有可能強加給屬性的choice限制,我可以做類似下面,但我印象中這是不可能的電流( 1.0)版本的XSD規範。

<!-- I wish: --> 
<xs:complexType name="colorType" > 
    <xs:attrchoice> 
    <xs:attribute name="value" type="HexLiteral" /> <!-- literal --> 
    <xs:attribute name="ref" type="xs:string" /> <!-- keyref (defined elsewhere) --> 
    </xs:attrchoice> 
</xs:complexType> 

這將使要麼 lieral value或keyref ref

<color value="0xFF0000" />  <!-- OK --> 
<color ref="dialogBorder1" /> <!-- OK --> 

但不能同時:

<color value="0xFF0000" ref="colorXYZ" /> <!-- NOT OK --> 

回答

2

的職位是什麼描述有些不一致。第一個XML顯示沒有屬性使用的顏色,那麼colorType的xsd會關閉一些屬性。我認爲XML是你想要的。

所以對於以下工作:

要定義一個顏色類型可以是一個十六進制文字(如爲0xFF0000爲鮮紅色)OR是

<xsd:simpleType name="ColorHex"> 
     <xsd:union memberTypes="xsd:string"> 
      <xsd:simpleType> 
       <xsd:restriction base="xsd:string"> 
        <xsd:pattern value="0x[0-9a-fA-F]{6}"/> 
       </xsd:restriction> 
      </xsd:simpleType> 
     </xsd:union> 
    </xsd:simpleType> 
別處定義的顏色的基準

上述使用相同的圖案在XHTML的Color類型(我示出該給你的靈感來源):

<!-- sixteen color names or RGB color expression--> 
    <xsd:simpleType name="Color"> 
     <xsd:union memberTypes="xsd:NMTOKEN"> 
      <xsd:simpleType> 
       <xsd:restriction base="xsd:token"> 
        <xsd:pattern value="#[0-9a-fA-F]{3}([0-9a-fA-F]{3})?"/> 
       </xsd:restriction> 
      </xsd:simpleType> 
     </xsd:union> 
    </xsd:simpleType> 

這裏的想法是使用聯合。缺點可能是由於所有不匹配的HEX模式都會被字符串匹配,所以無效的HEX語法(例如,缺失的數字)將作爲參考傳遞。

其他缺點可能與xsd:union所支持的編程語言有多相關。

+0

你在哪裏指的是顏色鍵?它看起來像問題要求*十六進制值*或* keyrefs。 – unhammer 2016-10-07 11:52:09

+0

@unhammer,我沒有提供key/keyref示例。你可以找到一個[這裏](http://stackoverflow.com/questions/18981481/xsd-restrict-content-to-be-equal-to-grandparent-if-it-is-present/18982861#18982861)。假設XSD將被設計爲使用不同的屬性,那麼它將是有道理的;不幸的是,這個問題沒有被澄清,並且假定第一個樣本XML是目標狀態就被接受了。 – 2016-10-08 21:18:35