Xml XSD:一个元素可以有不同的形式

Xml XSD:一个元素可以有不同的形式,xml,xsd,stylesheet,Xml,Xsd,Stylesheet,使用XSD,我想定义一个可以以三种不同形式出现的复杂元素: <Scope Name="foo" /> <!-- no children --> <Scope Name="foo" Src="bar" /> <!-- When Src is present, there must be no children! --> <Scope Name="foo"><!-- other children --></Scope&g

使用XSD,我想定义一个可以以三种不同形式出现的复杂元素:

<Scope Name="foo" />  <!-- no children -->
<Scope Name="foo" Src="bar" /> <!-- When Src is present, there must be no children! -->
<Scope Name="foo"><!-- other children --></Scope>

在第三种情况下,它被很好地定义为子元素(例如,所有三种类型的“范围”)。重要的是,具有“Src”属性的Scope元素必须为空

此外,在不同的地方,我只希望允许特定类型的元素。例如,在根标记中,我希望只允许第三种类型的一个Scope元素;在大多数情况下,我希望允许所有情况。这就是问题所在:如何解决这个问题

到目前为止,我所做的是:我为3个案例中的每一个创建了一个复杂类型,我可以在其中使用。但是,我不能使用:

<xs:choice minOccurs="0" maxOccurs="unbounded">
    <xs:element name="Scope" type="type_Scope_WithSrc" />
    <xs:element name="Scope" type="type_Scope_WithContent" />
    <xs:element name="Scope" type="type_Scope_Base" />
</xs:choice>

我试图创建这些元素的联合,但联合只允许用于SimpleType

我还尝试定义一个整体类型“type_Scope”,它使用xs:choice来包含它们。但是xs:choice将包括xs:elements,在本例中还需要一个名称:-(

你能告诉我怎么处理吗

请不要告诉我使用XSD:-(:-(

多谢各位

问候
divB

您可能会得到不同的答案,这取决于您是想用XSD 1.1还是XSD 1.0实现这一点;我假设您想要的是1.0解决方案,我将在这里介绍(我认为1.1还不实用)

如果您想保留元素名称并改变其内容,您在这里的唯一选择是使用xsi:type。只需使用一个范围元素,而不是一个选项;将其类型设置为复杂类型,并使用名为“name”的属性。让其他两个类型从此基类型扩展。这样就完成了

注意:我使用了一个基本抽象类型作为一种机制来通知人们,其他类型也将进入其中;事实上,即使没有它,它也可以工作,从一开始就使用类型\范围\基础

XSD:

这将使用
中的内容模型键入\u Scope\u和rc

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Sample XML generated by QTAssistant (http://www.paschidev.com) -->
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://tempuri.org/XMLSchema.xsd">
    <Scope xsi:type="type_Scope_WithSrc" Name="Name1" Src="Src1"/>
</root>
如果您想允许标记名的变化,可以将替换组的头放在那里,而不是选择,这至少可以为您提供一个没有xsi:type的解决方案

还有一些基于XSD1.1的解决方案,但在开放环境中,我不会使用类似的解决方案;现在不是每个人都有兼容的处理器,更不用说规范本身还不是推荐的

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Sample XML generated by QTAssistant (http://www.paschidev.com) -->
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://tempuri.org/XMLSchema.xsd">
    <Scope xsi:type="type_Scope_Base" Name="Name1"/>
</root>
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Sample XML generated by QTAssistant (http://www.paschidev.com) -->
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://tempuri.org/XMLSchema.xsd">
    <Scope xsi:type="type_Scope_WithSrc" Name="Name1" Src="Src1"/>
</root>
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Sample XML generated by QTAssistant (http://www.paschidev.com) -->
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://tempuri.org/XMLSchema.xsd">
    <Scope xsi:type="type_Scope_WithContent" Name="Name1">
        <me:hello.you xmlns:me="http://paschidev.com"/>
    </Scope>
</root>