我需要重新使用我在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元素,我回到了我开始的地方。
如果有人知道吗?
答案 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>