1

我正在为我的 XML 架构而苦苦挣扎,盯着屏幕也无济于事。我尝试为其创建架构的 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>

这会为每个命令类型创建一个具有名称的特殊元素,而实际上我只是希望根元素之间的部分由该命令所需的任何内容填充。

关于解决此问题的最佳方法的任何线索?

为每个命令创建一个模式会更好,还是可以将它们全部放在同一个模式中?

4

2 回答 2

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>
...
于 2012-10-18T14:09:31.503 回答
2

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

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

于 2012-10-18T17:06:13.073 回答