xsd 需要基于 xml 消息内容的不同元素

xsd requires different elements based on xml message content

我有 2 xml 条消息几乎相似,但确实有一些专用元素。现在我想将这些组合到消息中并为其创建一个“灵活的”xml 模式,以便我可以在处理之前对其进行验证。

我们的想法是拥有一个共同的结构,其中所有字段都在 xml 消息中定义,然后是不同字段的 2 个专用部分。然后以某种方式确定正在接收的消息,然后使用 xml 模式的通用且正确的专用部分进行验证。

下面是一个简单的例子。根据 TransportType(可以是汽车或船),xml 消息将包含 3 个元素。 2 个元素(品牌和型号)对两者都是通用的,另外 2 个(安全气囊和机动)根据选择而定。

汽车示例

<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <TransportType>Car</TransportType>
    <Input>
        <Make>String</Make>
        <Model>String</Model>
        <Airbags>true</Airbags>
    </Input>
</root>

船的例子

<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <TransportType>Boat</TransportType>
    <Input>
        <Make>String</Make>
        <Model>String</Model>
        <Motorized>true</Motorized>
    </Input>
</root>

我一直在尝试选择和参考,但如果不添加元素(这是不允许的)我就无法正常工作。

除非您准备在源文档中使用 xsi:type 属性来区分不同的情况,否则 XSD 1.0 无法做到这一点。在 XSD 1.1 中,您可以使用断言来完成它 - 尽管如果您可以使 TransportType 成为一个属性而不是一个元素,您可以使用条件类型分配来完成它,这是一个更简洁的解决方案,因为它是自定义的 -专为这项工作而设计。

https://www.xml.com/articles/2018/05/29/co-occurrence-cta-xsd/