假设我有一个如下所示的XML元素:
<foo>
<a>2</a>
<b>5</b>
</foo>
我想用架构(.xsd)表达以下约束:
<foo>
只有一个孩子<a>
和一个孩子<b>
,而且没有其他孩子。
<a>
和<b>
的值是区间[1,10]中的整数。
<a>
的值小于或等于<b>
的值。
我知道如何用模式表达约束1和2,但不知道3。
任何帮助?
答案 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 <= 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