限制或限制用于xsi:type属性的值

时间:2009-10-08 10:22:38

标签: xml xsd

我有以下xml:

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

在这个XSD中,我如何限制或限制为ValueFormatting元素的xsi:type属性提供的值,因为我有一个有效的四种或五种类型的列表(即TextFormatter,NumberFormatter, DateFormatter等)?

另外,在我的XSD中,如何强制属性名称为“xsi:type”?相反,我可能会因为“类型”的属性名称而逃脱,但如果在其他名称空间中声明“type”,我可能会冒险发生冲突吗?

谢谢!

1 个答案:

答案 0 :(得分: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>