0

我有想要使用 XSD 验证的 XML。这实际上是一个简单的场景,但我找不到正确的答案。这是 XML:

<data>
  <point>
    <x>count</x>
    <y>218</y>
  </point>
  <point>
    <x>maxtime</x>
    <y>1</y>
  </point>
  <point>
    <x>mintime</x>
    <y>0</y>
  </point>
  <point>
    <x>mean</x>
    <y>0.11</y>
  </point>
</data>

我想确保数据元素包含 4 个元素,并且只有一个x element = count,只有一个 x = maxtime ...

我现在拥有的是以下内容:

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="data">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="point" type="ctPoint" minOccurs="1" maxOccurs="4" />
        </xs:sequence>
    </xs:complexType>
</xs:element>

<xs:complexType name="ctPoint">
    <xs:sequence minOccurs="1" maxOccurs="4">
        <xs:element name="x" minOccurs="1" maxOccurs="1">
            <xs:simpleType>
                <xs:restriction base="xs:string">
                    <xs:enumeration value="count" />
                    <xs:enumeration value="maxtime" />
                    <xs:enumeration value="mintime" />
                    <xs:enumeration value="mean" />
                </xs:restriction>
            </xs:simpleType>
        </xs:element>
        <xs:element name="y" type="xs:decimal" minOccurs="1" maxOccurs="1" />
    </xs:sequence>
</xs:complexType>

这可以正确验证,但不能保证只有 1 个计数,只有 1 个 maxtime,......

4

2 回答 2

2
I want to make sure that the data element contains 4 point elements

您可以使用 XSD 1.0minOccurs="4"maxOccurs="4".

并且只有一个 x element = count,只有一个 x = maxtime ...

如果您坚持使用 XSD 1.0,则必须在带外(在代码中)完成此约束。

[更新:但是,请参阅@sergioFC 的良好 XSD 1.0 想法,了解xs:unique其意图是否只是让所有 x值在 .] 中是唯一的data。]

如果您可以使用XSD 1.1,正如@lexicore 建议的那样,它会起作用。使用xs:assert

  <xs:element name="data">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="point" type="ctPoint" minOccurs="4" maxOccurs="4" />
      </xs:sequence>
      <xs:assert test="count(point[x = 'count']) = 1 and
                       count(point[x = 'maxtime']) = 1"/>
    </xs:complexType>
  </xs:element>
于 2014-12-03T14:59:36.943 回答
1

您可以使用在 XSD 1.0中也有效的xs:uniqe

<xs:element name="data">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="point" type="ctPoint" minOccurs="1" maxOccurs="4" />
        </xs:sequence>
    </xs:complexType>
    <xs:unique name="myUnique">
        <!-- Select all points in data -->
        <xs:selector xpath="point" />
        <!-- The value of x of every selected point should be unique -->
        <xs:field xpath="x" />
    </xs:unique>
</xs:element>

此外,为了做到这一点,我认为您应该更改minOccurs,正如用户 kjhughes 在他的回答中所说的那样。

于 2014-12-05T14:09:54.120 回答