XSD 嵌套元素递归

XSD nested element recursion

我是 XSD 的新手,所以我的问题可能看起来很明显,但是,无论如何...

考虑我有以下 XML:

<om:model xmlns:om="http://www.r-style.com/2014/odm-model">
    <om:entry>
        <om:key>KEY1</om:key>
        <om:value>VALUE1</om:value>
    </om:entry>
    <om:entry>
        <om:key>KEY2</om:key>
        <om:value>VALUE2</om:value>
    </om:entry>
    <om:entry>
        <om:key>KEY3<om:key>
        <om:value>
            <om:model>
                <om:entry>
                    <om:key>KEY4</om:key>
                    <om:value>VALUE4</om:value>
                </om:entry>
                <om:entry>
                    <om:key>KEY5</om:key>
                    <om:value>VALU5E</om:value>
                </om:entry>
            </om:model>
        </om:value>
    </om:entry>
</om:model>

有没有一种方法可以创建这样的 XSD 模式来指定在标记中允许设置实际值(字符串类型)或嵌套 XML 本身。因此,我想要键值对或键-xml 对,并且 xml 还应该包含键值对或键-xml 对之类的东西。等等...

感谢您的宝贵时间!

P.S.: 目前我尝试使用以下 XSDSchema 但仍然必须确定它是否正确或现在:

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://www.r-style.com/2014/odm-model">
  <xs:element xmlns:odm="http://www.r-style.com/2014/odm-model" name="model" type="odm:modelType"/>
  <xs:complexType name="entryType">
    <xs:sequence>
      <xs:element type="xs:string" name="key"/>
      <xs:element name="value">
        <xs:complexType mixed="true">
          <xs:sequence>
            <xs:element xmlns:odm="http://www.r-style.com/2014/odm-model" type="odm:modelType" name="model" minOccurs="0"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="modelType">
    <xs:sequence>
      <xs:element xmlns:odm="http://www.r-style.com/2014/odm-model" type="odm:entryType" name="entry" maxOccurs="unbounded" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="valueType">
    <xs:sequence>
      <xs:element xmlns:odm="http://www.r-style.com/2014/odm-model" type="odm:modelType" name="model" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>
</xs:schema>

你的模式对我来说很好;它应该能很好地满足您的需求。

准确地说,在 XML 中不可能 独占地 设置文本或某些标签等内容模型。您需要使用混合内容模型,并且始终可以插入一些文本,即使插入了 <om:model>

为避免这种情况,您可以将 <om:value> 的文本内容包裹在标签中,例如<om:str>,并在模式定义中使用 <xs:choice>,产生类似的东西:

  <xs:element name="value">
    <xs:complexType>
      <xs:choice>
        <xs:element name="model"/>
        <xs:element name="str" type="xs:string" />
      </xs:choice>
    </xs:complexType>
  </xs:element>

其他可能性:使用架构 1.1.,您可以在 <xs:complexType>.

中添加 <xs:assert> 条件

只是一个小提示:为了避免到处重复 xmlns:odm="http://www.r-style.com/2014/odm-model",只需在 <xs:schema> 根声明上设置命名空间声明:

<xs:schema xmlns:odm="http://www.r-style.com/2014/odm-model"