【问题标题】:How can you define an element by position in XML Schema?如何在 XML Schema 中按位置定义元素?
【发布时间】:2020-12-14 10:08:37
【问题描述】:

如何在 XML Schema 中按位置定义元素?

我们正在获取各种 XML 数据提要,其中的数据是一系列 <row> 元素,实际值为 <value>

XML 文件的开头确实有一个 <metadata> 元素

但是我怎么能在 XSD 中说每个 <row> 中的第一个 <value> 应该是,例如xsd:dateTime?

... XML snippet !

<metadata>
      <item name="Month" type="xs:date"/>
      <item name="Planned Total" type="xs:double" precision="2"/>
</metadata>
<data>
    <row>
        <value>2019-11-01</value>
        <value>3607</value>
    </row>
    <row>
        <value>2019-12-01</value>
        <value>3091</value>
    </row>

... rest of XML ...

【问题讨论】:

    标签: xml xsd xsd-validation xml-validation


    【解决方案1】:

    要在 XML Schema 中按位置定义元素,请使用 xsd:sequence 并为不同类型使用不同的元素名称:

      <xs:element name="row">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="date" type="xs:dateTime"/>
            <xs:element name="total" type="xs:integer"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    

    任何对同名同级元素具有不同类型的设计都是错误的。这种约束不能在 DTD 或 XSD 1.0 中表示。它可以通过 XSD 1.1 中的断言来表示,但这很不自然。

    另请注意,您提供的 XML 不是 well-formed

    另见:

    【讨论】:

      【解决方案2】:

      不要忽视进行 XSLT 转换(到更自然的 XML 结构)然后对输出进行 XSD 验证的可能性。无论您最终使用“更自然”的 XML 进行进一步的应用程序处理,还是它只是为了验证目的而暂时存在,这都是可能的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-09-28
        • 1970-01-01
        • 1970-01-01
        • 2011-05-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多