2009-10-08 39 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