【问题标题】:How to create an XSD choice without an element name如何创建没有元素名称的 XSD 选项
【发布时间】:2012-10-19 01:06:13
【问题描述】:

我正在为我的 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>

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

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

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

【问题讨论】:

    标签: xml xsd


    【解决方案1】:

    首先,一般来说,您不能根据另一个标签(&lt;command&gt; 标签)的内容来更改一个标签(&lt;parameters&gt; 标签)的类型。可能有丑陋和复杂的方法来做到这一点,但我会推荐一个简单的解决方案。

    如果可以的话,你应该将你的 XML 重构为这样的:

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

    使用 Schema 很容易做到这一点:将 &lt;root&gt; 的内容定义为您的命令选择,并为每个命令创建一个包含参数定义的复杂类型。

    这就是它的样子:

    <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>
    ...
    

    【讨论】:

    • 我已经给对方发了一封邮件,希望我们能就简化协议达成一致。这样确实会更好。
    • 好消息,我的同事已经同意简化协议!
    【解决方案2】:

    这个问题通常被称为“共现约束”,这是 XSD 1.0 的一个众所周知的限制,即没有简单的解决方案。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多