这是我第二次问这个问题: 在 XML 文档(使用版本 1.1)中,元素
random
有两个整数: 一个整数 start
通常应该只具有 min=1
和 max=9
之间的值范围。和一个整数 end
总是应该更大然后从 max=10
的最大值开始。被这样定义:
<xs:complexType name="random">
<xs:attribute name="start">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:minInclusive value="1"/>
<xs:maxInclusive value="9"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="end">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:minInclusive value="2"/>
<xs:maxInclusive value="10"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:assert test="@start le @end"/>
</xs:complexType>
但是现在在一些罕见的情况下,当另一个元素中存在属性
bigValue
时,我希望这些整数实际上能够具有更高的值。为了实现这一点,我可以将元素 random
作为 complexType-item annotation
的子元素,它在 XSD 文件中定义如下:
<xs:complexType name="annotation" mixed="true">
<xs:sequence>
<xs:element name="random" type="random" minOccurs="0" maxOccurs="1"/>
</xs:sequence>
<xs:attribute name="annotation">
<xs:simpleType>
<xs:union memberTypes="comments dice"/>
</xs:simpleType>
</xs:attribute>
<---- INSERT ASSERT HERE ---->
</xs:complexType>
例如,在定义了
bigValue
的情况下,start
的值为20,end
的值为50:
<annotation extended='bigValue'/><random start='20' end='50'/>
有什么方法可以做到这一点而不必更改
start
和end
的值范围(因为在几乎所有其他情况下,它不应该大于9或10)。例如,这可以通过断言来实现吗?或者这根本不可能,更好的方法是在 bigValue
不存在的情况下通过断言限制最大值?
我已经尝试了很多断言,例如以下断言,但所有断言都无法编译,只会抛出“XPST0003 - 断言 XPath 表达式无法成功编译”错误。这是我尝试过的:
<xs:assert test="if exists(annotation/bigValue) or every $x in .//@random.start satisfies $x le 10"/>
<xs:assert test="exists(annotation/bigValue) or every $x in .//@random.start satisfies $x le 10"/>
<xs:assert test="if ((random) and (annotation) and exists(annotation/bigValue)) or every $x in .//@random.start satisfies $x le 10"/>
此外,对于开始和结束的值定义得更高的情况,我尝试了一个重组的断言。但是,即使我找到了一个已编译的断言,它也完全破坏了 XML 文档,告诉我断言评估没有成功的任何元素,所以我也不得不删除它。我使用的断言是:
<xs:assert test="if (random.start le 9) then (annotation.annotation = 'bigValue') else not(random.start le 9)"/>
所以在这一点上,我相当无能为力,也很困惑如何去做。你能帮帮我吗?