如何为XSD的sequence元素定义属性?现有代码及需求说明
解决方案
首先,你可以通过**属性组(attributeGroup)**复用Number和Label属性的定义,避免重复编写代码;同时需要为每个元素定义包含属性与文本内容的复杂类型——因为原元素类型为xsd:string(表示元素包含文本值),添加属性后必须用复杂类型来组合两者。
以下是修正并完成后的XSD代码:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <!-- 定义可复用的属性组:包含Number和Label属性 --> <xsd:attributeGroup name="DimensionAttributes"> <xsd:attribute name="Number" type="xsd:string" use="required"/> <xsd:attribute name="Label" type="xsd:string" use="required"/> </xsd:attributeGroup> <!-- 定义Dimension元素的复杂类型:包含属性组 + 子元素选择 + 文本内容 --> <xsd:complexType name="DimensionType"> <xsd:sequence> <xsd:choice> <xsd:element name="DimensionDebit" type="DimensionValueType"/> <xsd:element name="DimensionCredit" type="DimensionValueType"/> </xsd:choice> </xsd:sequence> <xsd:attributeGroup ref="DimensionAttributes"/> </xsd:complexType> <!-- 定义DimensionDebit/Credit的复杂类型:包含属性组 + 文本内容 --> <xsd:complexType name="DimensionValueType"> <xsd:simpleContent> <xsd:extension base="xsd:string"> <xsd:attributeGroup ref="DimensionAttributes"/> </xsd:extension> </xsd:simpleContent> </xsd:complexType> <!-- 主sequence结构 --> <xsd:sequence minOccurs="0" maxOccurs="40"> <xsd:element name="Dimension" type="DimensionType" form="qualified"/> </xsd:sequence> </xsd:schema>
代码说明:
- 属性组
DimensionAttributes:统一定义Number和Label属性,设置use="required"表示这两个属性为必填(若允许可选,可改为use="optional")。 DimensionValueType:用于DimensionDebit和DimensionCredit元素,通过simpleContent扩展xsd:string类型,既保留元素的文本值,又添加属性组。DimensionType:用于Dimension元素,包含子元素的choice结构,同时引用属性组,满足Dimension元素包含子元素且自身带属性的需求。- 修正了原XSD中的语法错误:补充了未闭合的
<xsd:element>标签,规范了嵌套结构。
符合需求的示例XML:
<!-- 包含子元素的Dimension示例 --> <Dimension Number="2" Label="Ty:"> <DimensionDebit Number="2" Label="Ty:">248000</DimensionDebit> </Dimension> <!-- 单独的DimensionDebit示例 --> <DimensionDebit Number="2" Label="Ty:">248000</DimensionDebit>
内容的提问来源于stack exchange,提问作者PekkaPee
相关产品推荐
相关产品推荐

