如何在没有元素名称的情况下创建XSD选项

时间:2012-10-18 13:55:24

标签: xml xsd

我正在努力使用我的XML Schema并且盯着屏幕没有帮助。 XML我试图创建一个这样的模式:

<root>
   <command>FOO|BAR|BLOOP</command>
   <parameters>
       <param1>val</param1>
       <param2>val</param2>
   </parameters>
<root>

根据命令值= FOO,BAR或BLOOP,参数标签中需要有一组不同的参数,它们可能为空。定义了为特定命令显示的参数集,并且某些命令名具有相同的参数集。

我要做的就是为每个命令创建一个类型,一个用于FOO,一个用于BAR,一个用于BLOOP,在这些类型中我可以放置他们使用的参数。

然而,当我做类似的事情时:

<xs:element name="root">
  <xs:complexType>
    <xs:element name="myCommand" type="myCommandType"/>
  </xs:complexType>
</xs:element>

这创建了一个特殊的元素,每个命令类型都有一个名称,实际上我只希望根元素之间的部分由命令所需的东西填充。

关于最好的解决方法的任何线索?

为每个命令创建架构会更好吗?或者我可以将它们全部放在同一个架构中吗?

2 个答案:

答案 0 :(得分:2)

首先,您通常无法更改一个标记(<parameters>标记)的类型,具体取决于另一个标记(<command>标记)的内容。可能有丑陋而复杂的方法,但我建议一个简单的解决方案。

如果可以,您应该将XML重组为以下内容:

<root>
  <foo-command>
    <param1>val</param1>
    <param2>val</param2>
    <param3>val</param3>
  </foo-command>
</root>

使用Schema很容易:定义<root>的内容作为命令的选择,并为包含参数定义的每个命令创建一个复杂类型。

以下是这样的结果:

<element name="root">
    <complexType>
        <choice>
            <element name="foo-command" type="tns:foo-command-type"/>
            <element name="bar-command" type="tns:bar-command-type"/>
            ...
        </choice>
    </complexType>
</element>

<complexType name="foo-command-type">
    <sequence>
        <element name="param1" type="boolean"/>
        <element name="param2" type="int"/>
        ...
    </sequence>
</complexType>
<complexType name="bar-command-type">
    ...
</complexType>
...

答案 1 :(得分:2)

问题通常出现在“共现约束”的名称下,而且XSD 1.0的一个众所周知的限制是没有简单的解决方案。

在XSD 1.1中,有一项名为“条件类型分配”的新功能可以完全满足您的需求。 XSD 1.1目前在Xerces和Saxon中实现。