在XSD中,是否可以为属性设置替代类型?
In XSD, is it possible to set alternative types for attributes?
尽管告诉我我没有通过在属性中使用数据项而不是标签内容块来正确使用 XML...但这是一个内部数据管理项目,这是我的使用 XML 的第一个应用程序,我是 XSD.
的新手
下面是我的 XML 的典型部分,描述了 BOM 的一层。如果没有尺寸属性,数量是我汇总的一个值(当我只需要 10 个坚果时,无需说我两次需要 5 个坚果),但有些项目是单一数量的单位(长度、质量等)和我想知道我需要多少个尺码。
<Part PartID="8035446-1">
<Operation>
<Material PartID="7731112-1" Unit="EA" Qty="5"/>
<Material PartID="788315M" Unit="IN" Qty="7.5"/>
<Material PartID="7886005" Unit="IN" Qty="1" Size="14"/>
</Operation>
</Part>
最初(下图)我使用 xs:int
表示数量,xs:float
表示尺寸。然后我遇到了像电线(上面的例子)这样的项目,我在其中聚合非整数项目长度。所以我正在为这两个属性使用 xs:float
。我已经搜索了很多文档和示例,但都没有成功。所有 xs:alternative
示例均基于标签内容类型。
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Parts">
<xs:complexType>
<xs:sequence>
<xs:element name="Part" type="PartType" minOccurs="1" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="Group" type="xs:string" use="required"/>
</xs:complexType>
</xs:element>
<xs:complexType name="PartType">
<xs:sequence>
<xs:element name="Operation" type="OperationType" minOccurs="1" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="PartID" type="xs:string" use="required"/>
<xs:attribute name="Phantom" type="xs:string" default="M"/>
</xs:complexType>
<xs:complexType name="OperationType">
<xs:sequence>
<xs:element name="Material" type="MaterialType" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="WC" type="xs:string" default="TACwip"/>
</xs:complexType>
<xs:complexType name="MaterialType">
<xs:attribute name="PartID" type="xs:string" use="required"/>
<xs:attribute name="Unit" type="xs:string" use="required"/>
<xs:attribute name="Qty" type="xs:int" use="required"/>
<xs:attribute name="Size" type="xs:float" use="optional"/>
</xs:complexType>
</xs:schema>
我考虑的另一个选择是将其保留为 xs:float
并尝试编写一个 xs:assert
语句来检查当存在 Size 属性时 Qty 是否为 xs:int
。我的问题是我似乎找不到允许我评估字段类型的 XPath 语句。
再次强调,我使用 XML 并不是为了让我进入一个不应该的用例,但既然我在这里,我宁愿不重构迄今为止完成的工作。如果我不解决这个问题,我会活下来,但它正在吞噬我的脑后。
假设您使用的是 XSD 1.1 处理器,xs:alternative 允许您根据元素属性的 one/some 值为其定义替代的复杂类型。可选的复杂类型定义了允许的元素内容和允许的属性。所以是的,你正在尝试做的事情在 XSD 1.1.
中是可能的
尽管告诉我我没有通过在属性中使用数据项而不是标签内容块来正确使用 XML...但这是一个内部数据管理项目,这是我的使用 XML 的第一个应用程序,我是 XSD.
的新手下面是我的 XML 的典型部分,描述了 BOM 的一层。如果没有尺寸属性,数量是我汇总的一个值(当我只需要 10 个坚果时,无需说我两次需要 5 个坚果),但有些项目是单一数量的单位(长度、质量等)和我想知道我需要多少个尺码。
<Part PartID="8035446-1">
<Operation>
<Material PartID="7731112-1" Unit="EA" Qty="5"/>
<Material PartID="788315M" Unit="IN" Qty="7.5"/>
<Material PartID="7886005" Unit="IN" Qty="1" Size="14"/>
</Operation>
</Part>
最初(下图)我使用 xs:int
表示数量,xs:float
表示尺寸。然后我遇到了像电线(上面的例子)这样的项目,我在其中聚合非整数项目长度。所以我正在为这两个属性使用 xs:float
。我已经搜索了很多文档和示例,但都没有成功。所有 xs:alternative
示例均基于标签内容类型。
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Parts">
<xs:complexType>
<xs:sequence>
<xs:element name="Part" type="PartType" minOccurs="1" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="Group" type="xs:string" use="required"/>
</xs:complexType>
</xs:element>
<xs:complexType name="PartType">
<xs:sequence>
<xs:element name="Operation" type="OperationType" minOccurs="1" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="PartID" type="xs:string" use="required"/>
<xs:attribute name="Phantom" type="xs:string" default="M"/>
</xs:complexType>
<xs:complexType name="OperationType">
<xs:sequence>
<xs:element name="Material" type="MaterialType" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="WC" type="xs:string" default="TACwip"/>
</xs:complexType>
<xs:complexType name="MaterialType">
<xs:attribute name="PartID" type="xs:string" use="required"/>
<xs:attribute name="Unit" type="xs:string" use="required"/>
<xs:attribute name="Qty" type="xs:int" use="required"/>
<xs:attribute name="Size" type="xs:float" use="optional"/>
</xs:complexType>
</xs:schema>
我考虑的另一个选择是将其保留为 xs:float
并尝试编写一个 xs:assert
语句来检查当存在 Size 属性时 Qty 是否为 xs:int
。我的问题是我似乎找不到允许我评估字段类型的 XPath 语句。
再次强调,我使用 XML 并不是为了让我进入一个不应该的用例,但既然我在这里,我宁愿不重构迄今为止完成的工作。如果我不解决这个问题,我会活下来,但它正在吞噬我的脑后。
假设您使用的是 XSD 1.1 处理器,xs:alternative 允许您根据元素属性的 one/some 值为其定义替代的复杂类型。可选的复杂类型定义了允许的元素内容和允许的属性。所以是的,你正在尝试做的事情在 XSD 1.1.
中是可能的