如何引用XSD中的元素并为其命名?

时间:2014-02-12 14:26:49

标签: tags xsd element enumeration simpletype

我需要重新使用我在XSD中创建的状态标记。例如,在我们的订单公司,我们有几种状态。订单 - 汽车订单,卡车订单等的状态

遗憾的是,需要使用的标签不一样。对于汽车来说,它是一个carStatus,对于卡车来说,它是一个truckStatus,但底层物体是相同的。它是一个xs:string标记,其枚举为COMPLETED,BUSY或AWAITING INFORMATION。

现在我不想为16个物体(汽车,赛道,直升机...... - 状态)提供16个标签。明天,如果我们添加另一个状态,我必须转到所有这些元素并更新它。

我引用GenericCodeStatus的XSD如下所示

<xs:schema targetNamespace="http://www.myDomain.co.za/myCoreXsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:mine="http://www.myDomain.co.za/myCoreXsd" elementFormDefault="qualified" attributeFormDefault="unqualified">
      <!-- Defining my Enum -->
<xs:element name="GenericCodeStatus">
    <xs:annotation>
        <xs:documentation>Generic code status</xs:documentation>
    </xs:annotation>
    <xs:simpleType>
        <xs:restriction base="xs:string">
            <xs:enumeration value="COMPLETED"/>
            <xs:enumeration value="BUSY"/>
            <xs:enumeration value="AWAITING INFORMATION"/>
        </xs:restriction>
    </xs:simpleType>
</xs:element>

      <!-- Here I have mytag where I am referencing the genericCodeStatus -->
<xs:complexType name="MyTag1">
    <xs:sequence>
        <xs:element ref="mine:GenericCodeStatus"/>
    </xs:sequence>
</xs:complexType>

现在我想让MyTag1下的genericCodeStatus有一个名字。 我尝试使用名称和类型标记创建它(我使用XML Spy作为编辑器)

<?xml version="1.0" encoding="utf-8"?>
<xs:schema targetNamespace="http://www.myDomain.co.za/myCoreXsd"    xmlns:mine="http://www.myDomain.co.za/myCoreXsd" xmlns:xs="http://www.w3.org/2001/XMLSchema"   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" elementFormDefault="qualified"  attributeFormDefault="unqualified">
<!-- Defining my Enum -->
<xs:element name="GenericCodeStatus">
    <xs:annotation>
        <xs:documentation>Generic code status</xs:documentation>
    </xs:annotation>
    <xs:simpleType>
        <xs:restriction base="xs:string">
            <xs:enumeration value="COMPLETED"/>
            <xs:enumeration value="BUSY"/>
            <xs:enumeration value="AWAITING INFORMATION"/>
        </xs:restriction>
    </xs:simpleType>
</xs:element>
<xs:complexType name="MyTag1">
    <xs:sequence>
        <!-- Taken this out -->
        <xs:element ref="mine:GenericCodeStatus"/>
        <!-- and replace it with name and type -->
        <xs:element name="carStatus" type="mine:GenericCodeStatus"/>
    </xs:sequence>
</xs:complexType>

然后得到“类型”遇到错误的未定义值的错误。 我也尝试删除'mine'命名空间。

如果我尝试用

中的ref替换类型
<?xml version="1.0" encoding="utf-8"?>
<xs:schema targetNamespace="http://www.myDomain.co.za/myCoreXsd" xmlns:mine="http://www.myDomain.co.za/myCoreXsd" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" elementFormDefault="qualified" attributeFormDefault="unqualified">
<!-- Defining my Enum -->
<xs:element name="GenericCodeStatus">
    <xs:annotation>
        <xs:documentation>Generic code status</xs:documentation>
    </xs:annotation>
    <xs:simpleType>
        <xs:restriction base="xs:string">
            <xs:enumeration value="COMPLETED"/>
            <xs:enumeration value="BUSY"/>
            <xs:enumeration value="AWAITING INFORMATION"/>
        </xs:restriction>
    </xs:simpleType>
</xs:element>
<xs:complexType name="MyTag1">
    <xs:sequence>
        <!-- Taken this out -->
        <xs:element ref="mine:GenericCodeStatus"/>
        <!-- and replace it with name and ref -->
        <xs:element name="carStatus" ref="GenericCodeStatus"/>
    </xs:sequence>
</xs:complexType>

验证工作正常但如果我保存它,XML Spy正在删除name元素,我回到了我开始的地方。

如果有人知道吗?

1 个答案:

答案 0 :(得分:1)

我找到了答案但想到仍然发布这个很难找到。感谢我的朋友:)

我不应该像我一样定义Element,然后尝试使用新名称一遍又一遍地引用它。

我应该做的是自己定义simpleType并为其命名。

<!-- Define the simpleType as an enum and give it a name -->
<xs:simpleType name="myCoolDataType">
    <xs:restriction base="xs:string">
        <xs:enumeration value="COMPLETED"/>
        <xs:enumeration value="BUSY"/>
        <xs:enumeration value="AWAITING INFORMATION"/>
    </xs:restriction>
</xs:simpleType>

然后我想要使用它我需要定义元素,并给它一个类型,其中包含你在第一个规则中给予枚举的值

<xs:complexType name="MyTag1">
    <xs:sequence>
        <xs:element name="truckStatus" type="mine:myCoolDataType"/>
        <xs:element name="carStatus" type="mine:myCoolDataType"/>
    </xs:sequence>
</xs:complexType>