Xml 如何定义属性中具有不同值的两个元素?
是否可以定义可以验证此类xml的xsd方案:Xml 如何定义属性中具有不同值的两个元素?,xml,xsd,xsd-validation,Xml,Xsd,Xsd Validation,是否可以定义可以验证此类xml的xsd方案: <test> <name Type="1" SomeAttr="value" > <info a="1" b="2"/> </name> <name Type="3" SomeAttr="value" /> </test> 在此xml中,可以有1个或2个元素“name” 在第一个元素中,属性“Type”中的“name”只能是2个值-1或2 在第二个元素中
<test>
<name Type="1" SomeAttr="value" >
<info a="1" b="2"/>
</name>
<name Type="3" SomeAttr="value" />
</test>
在此xml中,可以有1个或2个元素“name”
在第一个元素中,属性“Type”中的“name”只能是2个值-1或2
在第二个元素中,属性“Type”中的“name”只能是1值-3
在xml中,只能有1个子元素“info”,必须将其处理为属性值为1或2的父元素“name”(而不是类型为“3”的“name”)
请帮忙。
谢谢。在XSD中,作为同一父级的子级出现的任何两个同名元素必须具有相同的类型。(这里我省略了一些复杂之处;需要完整信息的读者必须查阅规范。)因此,在典型的文档验证中,与元素相关联的类型完全由从验证事件的根到元素本身的路径决定,也不取决于它在父母子女中的地位 所以:不,不能给两个同级元素相同的名称和不同的类型 如果这两个元素出现在不同的上下文中,它们可以有不同的类型。因此,像下面这样的XML可以工作:
<test>
<context-1>
<name Type="1" SomeAttr="value" >
<info a="1" b="2"/>
</name>
</context-1>
<context-2>
<name Type="3" SomeAttr="value" />
</context-2>
</test>
但让两个“name”元素具有不同类型的最简单方法是为它们指定不同的名称,以反映它们性质的差异
<test>
<red-name Type="1" SomeAttr="value" >
<info a="1" b="2"/>
</red-name>
<green-name Type="3" SomeAttr="value" />
</test>
如果您希望模式以某种方式反映两种形式的名称是同一事物的不同形式,那么XSD提供了两种明显的机制:
- 您可以定义一个
类型,从中派生类型的红色和绿色。因此,这两种类型之间的关系反映在类型层次结构中名称
- 您可以定义一个抽象(或具体!)
元素,并声明两个特定变量(此处称为名称
和红色名称
)作为它的替代。因此,红色和绿色名称元素之间的关系反映在替换组关系中绿色名称
xs:alternative
允许元素根据提供的条件具有不同的类型
<xs:element name="name">
<xs:alternative test="@Type=1" type="name_type_1"/>
<xs:alternative test="@Type=3" type="name_type_3"/>
</xs:element>
问题中XML的完整架构可能如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
elementFormDefault="qualified"
attributeFormDefault="unqualified"
vc:minVersion="1.1">
<xs:element name="test">
<xs:complexType>
<xs:sequence>
<xs:element name="name" minOccurs="0" maxOccurs="unbounded">
<xs:alternative test="@Type=1" type="name_type_1"/>
<xs:alternative test="@Type=3" type="name_type_3"/>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="name_type_1">
<xs:sequence>
<xs:element name="info">
<xs:complexType>
<xs:attribute name="a"/>
<xs:attribute name="b"/>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="Type" type="xs:integer"/>
<xs:attribute name="SomeAttr"/>
</xs:complexType>
<xs:complexType name="name_type_3">
<xs:attribute name="Type" type="xs:integer"/>
<xs:attribute name="SomeAttr"/>
</xs:complexType>
</xs:schema>