2009-10-08 30 views
3

我有以下片的xml:限制或約束用於的xsi值:type屬性

<MyField> 
    <FieldName>Blah</FieldName> 
    <ValueFormatting xsi:type="DateFormatter"> 
     <Format>dd/MM/yy</Format> 
    </ValueFormatting> 
</MyField> 

在這種XSD,如何可以限制或約束被提供用於xsi:type屬性上的值ValueFormatting元素,因爲我有一個有效的四個或五個類型的列表(即TextFormatter,NumberFormatter,DateFormatter等)?

另外,在我的XSD中,如何強制實施屬性名稱爲「xsi:type」?是否正確,我有可能逃避擁有「type」屬性名稱,但是如果在其他命名空間中聲明瞭「type」,那麼我可能冒着碰撞風險?

謝謝!

回答

3

要限制「type」屬性的允許值,請在「type」屬性的XSD定義中使用標籤。

至於屬性名稱本身,XML需要定義一個使用給定前綴的名稱空間(默認或其他),然後XSD需要在「type」的「targetNamespace」屬性中指定相同的名稱空間。屬性的定義。您不能強制XML專門使用「xsi」前綴(實際上,「xsi」前綴是保留的),但您可以強制指出它指向的名稱空間,以確保XML使用您的「type」屬性而不是別人的。

例如:

<xsd:element name="ValueFormatting"> 
    <xsd:complexType> 
    <xsd:attribute name="type" minOccurs="1" maxOccurs="1" targetNamespace="http://..."> 
     <xsd:simpleType> 
     <xsd:restriction base="xsd:string"> 
      <xsd:enumeration value="TextFormatter" /> 
      <xsd:enumeration value="NumberFormatter" /> 
      <xsd:enumeration value="DateFormatter" /> 
     </xsd:restriction> 
     </xsd:simpleType> 
    </xsd:attribute> 
    ... 
    </xsd:complexType> 
</xsd:element> 

<MyField> 
    <FieldName>Blah</FieldName> 
    <ValueFormatting xmlns:myns="http://..." myns:type="DateFormatter"> 
     <Format>dd/MM/yy</Format> 
    </ValueFormatting> 
</MyField> 
+1

這是怎麼應該工作? 'xs:attribte'沒有'targetNamespace'屬性。 – 2011-08-01 13:13:11

+1

當時,閱讀XML Schema規範(http://www.w3.org/TR/2004/REC-xmlschema-1-20041028/#cAttribute_Declarations)使它看起來像它一樣。現在重新閱讀它,它看起來像'xs:attribute'代替父代'schema'繼承'targetNamespace'。 – 2011-08-01 21:51:41

+0

感謝您的澄清。會試試這個。 – 2011-08-02 07:34:11