如何在XSD v1.0中使用相同名称但不同类型的不同元素

时间:2013-06-03 15:06:58

标签: xml validation xsd xsd-1.0

我的代码库相对较大,包含两种类型的XML:

<tag ref="var_ref" />

<tag>value</tag>

但是,我希望以下内容无法验证,因为它在我们的情况下是不明确的。

<tag ref="var_ref">value</tag>

我看到v1.1中可能存在替代方案,但有没有人对XSD 1.0进行破解?

1 个答案:

答案 0 :(得分:1)

1.0最简单的方法是为这两种不同的验证行为提供不同的名称。 (有些权威人士会说,这不是一个黑客,只是简单的设计。为什么给两个结构明显不同的东西赋予相同的名称?把事情称之为:当它们不同时,称它们为不同的东西。许多事情都比较简单,包括XML和XML处理。)

如果您的目标命名空间绑定到前缀tns,您可以写:

<xsd:element name="tns:TAG" abstract="true"/>
<xsd:element name="tag" type="xsd:string" 
             substitutionGroup="tns:TAG"/>
<xsd:element name="tagref" 
             substitutionGroup="tns:TAG">
  <xsd:sequence/>
  <xsd:attribute name="ref" type="xsd:IDREF"/>
  <!--* or adjust the type to suit ... *-->
</xsd:element>

然后使用对tns:tag的引用替换现有内容模型中对tns:TAG的所有引用。