我正在努力使用我的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>
这创建了一个特殊的元素,每个命令类型都有一个名称,实际上我只希望根元素之间的部分由命令所需的东西填充。
关于最好的解决方法的任何线索?
为每个命令创建架构会更好吗?或者我可以将它们全部放在同一个架构中吗?
答案 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中实现。