這可以通過幾種方法來解決,有些比使用其他斷言
一個更好的解決方案 - 但不是一個偉大的...
在XSD 1.1,你可以使用<xs:assert>
執行此操作。理想情況下,斷言將被放置在引用元素<Restriction>
上,這將明確哪個<Restriction>
無效。
但是,由於<xs:assert>
不能訪問值高爬在樹上的<xs:assert>
必須足夠高了有<Restriction>
及其範圍(兒童)內<Variable>
。這樣可以,但現在你必須寫一條通用規則,如果失敗不會提供太多反饋 - 它只會告訴你一個或多個<Restriction>
無效。
繼承人是一個非常快速的示例來演示。臨界CVC-斷言:斷言評價('計數(使用方法:
<?xml version="1.0" encoding="utf-8" ?>
<!--Created with Liquid XML 2017 Developer Bundle Edition 15.0.0.0 (https://www.liquid-technologies.com)-->
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="base">
<xs:complexType>
<xs:sequence>
<xs:element name="var" type="xs:string" minOccurs="0" maxOccurs="unbounded" />
<xs:element name="Usage" type="xs:string" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
<xs:assert test="count(Usage[not(./text() = ../var/text())]) = 0" />
</xs:complexType>
</xs:element>
</xs:schema>
示例XML
<?xml version="1.0" encoding="utf-8"?>
<!-- Created with Liquid XML 2016 Developer Bundle Edition 14.1.4.6649 (https://www.liquid-technologies.com) -->
<base xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Schema.xsd">
<var>var1</var>
<var>var2</var>
<var>var4</var>
<Usage>var1</Usage>
<Usage>var2</Usage>
<Usage>var3</Usage><!-- INVALID -->
</base>
誤差(經由撒克遜)
(7 10)消息對於模式類型'#AnonType_base'上的元素'base',[not(./ text()= ../ var/text())])= 0')沒有成功。
使用更好的解決方案主要/ KeyRef的
這是XSD 1.0友好和工作得很好。它告訴你是否有重複的變量名稱,並且如果變量名稱引用無效,則指出實際問題。
<?xml version="1.0" encoding="utf-8" ?>
<!--Created with Liquid XML 2017 Developer Bundle Edition 15.0.0.0 (https://www.liquid-technologies.com)-->
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="base">
<xs:complexType>
<xs:sequence>
<xs:element name="Variables">
<xs:complexType>
<xs:sequence>
<xs:element name="Variable" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="name" type="xs:string" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Restrictions">
<xs:complexType>
<xs:sequence>
<xs:element name="Restriction" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="variable" type="xs:string" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:key name="VarDef">
<xs:selector xpath="./Variables/Variable" />
<xs:field xpath="@name" />
</xs:key>
<xs:keyref name="VarRef" refer="VarDef">
<xs:selector xpath="./Restrictions/Restriction" />
<xs:field xpath="@variable" />
</xs:keyref>
</xs:element>
</xs:schema>
示例XML
<?xml version="1.0" encoding="utf-8"?>
<!-- Created with Liquid XML 2017 Developer Bundle Edition 15.0.0.0 (https://www.liquid-technologies.com) -->
<base xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="SchemaKeyRef.xsd">
<Variables>
<Variable name="var1"></Variable>
<Variable name="var2"></Variable>
<Variable name="var3"></Variable>
</Variables>
<Restrictions>
<Restriction variable="var1">string</Restriction>
<Restriction variable="var2">string</Restriction>
<Restriction variable="UNKNOWN">string</Restriction>
</Restrictions>
</base>
現在所產生的誤差是更具體的,使調試問題要容易得多。
錯誤從.net(行號是壞的限制)
(12:10)中的錯誤「VarDef」 Keyref關鍵序列「未知」沒有提到一些鍵。從撒克遜
錯誤(行號是包含元素基)
(14:7)的關鍵CVC-身份constraint.4.3:密鑰 'VarRef' 具有值 '未知' 未找到身份元素'base'的約束。