元素之间的XML模式约束

时间:2017-10-31 07:26:30

标签: xml xsd

假设我有一个如下所示的XML元素:

<foo>
    <a>2</a>
    <b>5</b>
</foo>

我想用架构(.xsd)表达以下约束:

  1. <foo>只有一个孩子<a>和一个孩子<b>,而且没有其他孩子。

  2. <a><b>的值是区间[1,10]中的整数。

  3. <a>的值小于或等于<b>的值。

  4. 我知道如何用模式表达约束1和2,但不知道3。

    任何帮助?

2 个答案:

答案 0 :(得分:3)

对于第3点,您可以添加以下约束:

<xs:complexType name="foo">
    <xs:sequence>
        <!-- or all if the order is not important -->
        <xs:element name="a" type="xs:integer" maxOccurs="1" minOccurs="1">
            <xs:simpleType>
                <xs:restriction base="xs:integer">
                    <xs:minInclusive value="1"/>
                    <xs:maxInclusive value="10"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:element>
        <xs:element name="b" type="xs:integer" maxOccurs="1" minOccurs="1">
            <xs:simpleType>
                <xs:restriction base="xs:integer">
                    <xs:minInclusive value="1"/>
                    <xs:maxInclusive value="10"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:element>
    </xs:sequence>
    <xs:assert test="a &lt;= b"/> <!-- your 3rd constraint -->
</xs:complexType>

答案 1 :(得分:3)

正如@Allan所说,你可以使用xs:assert。虽然值得一提的是,这需要XSD 1.1,许多架构处理器都不支持它。

事实上,一旦你使用XSD 1.1,我倾向于变得懒惰,并使用def addToScene(self): for ix in self.notInScene.listView.selectionModel().selectedIndexes(): id = self.notInScene.model.record(ix.row()).value("characterID") query = QSqlQuery() query.prepare("INSERT INTO CharacterInScene VALUES (:characterID, :sceneID);") query.bindValue(":characterID", id) query.bindValue(":sceneID", self.sceneId) if not query.exec_(): print(query.lastError().text()) self.updateList() # update the model def removeFromScene(self): for ix in self.inScene.listView.selectionModel().selectedIndexes(): id = self.inScene.model.record(ix.row()).value("characterID") query = QSqlQuery() query.prepare("DELETE FROM CharacterInScene WHERE characterID = :characterID AND sceneID = :sceneID;") query.bindValue(":characterID", id) query.bindValue(":sceneID", self.sceneId) if not query.exec_(): print(query.lastError().text()) self.updateList() # update the model 表达更多的约束。我可能会把这个写成:

xs:assert