2

我有一个 XML 文档(基本上)看起来像这样:

...
<param>
    <key>age</key>
    <value>10</value>
</param>
<param>
    <key>smart</key>
    <value>true</value>
</param>
...

我想根据参数键限制可用值,例如年龄应该是 [0, 150] 中的整数,智能应该是真或假。

现在,如果 XML 不同(例如,如下例所示),那将非常简单:

...
<age>10</age>
<smart>true</smart>
...

但是,此时 XML 结构不会改变,我不确定它是否应该改变。有没有办法用当前的 XML 结构来实现这些类型的约束,如果有,怎么做?

更新:

从(完全没有)反馈来看,我想说这很可能使用 XSD 是不可能的。有人可以确认吗?

4

1 回答 1

1

似乎您实际上需要一个看起来像这样的定义:

  <!-- This is an INVALID example -->
  <xs:element name="param">
    <xs:complexType>
      <xs:choice>
        <xs:sequence>
          <xs:element name="key" type="xs:string" fixed="age" />
          <xs:element name="value" type="xs:decimal" />
        </xs:sequence>
        <xs:sequence>
          <xs:element name="key" type="xs:string" fixed="smart" />
          <xs:element name="value" type="xs:boolean" />
        </xs:sequence>
      </xs:choice>
    </xs:complexType>
  </xs:element>

不幸的是,这样的代码会导致无效的 XML Schema文件。

尽管语法是正确的,但语义违反了模式规则。具有相同名称和相同作用域的元素必须具有相同的类型。在这种情况下,这尤其意味着作为<value>元素子元素的所有<param>元素必须具有相同的类型。

形式上这是Schema Component Constraint: Element Declarations Consistent。另请参阅以下架构组件约束;通常,您不能使元素类型依赖于文档中的某些其他值或有关序列其余部分中的项目的任何信息。

更新

我完全忘记了这一点,但是如果您在实例文档中指定所需的类型而不是纯粹在模式中定义它,您应该能够获得所需的约束。这可以通过将xsi:type属性添加到<value>元素来完成。

例子

<param>
    <key>age</key>
    <value xsi:type="xs:decimal">10</value>
</param>
<param>
    <key>smart</key>
    <value xsi:type="xs:boolean">true</value>
</param>

当然这有点不方便,因为它需要更改 XML 生成过程。此外,它不会自动提供任何保证<key>和定义xsi:type是匹配对。

于 2011-10-21T14:12:41.580 回答