XSD:如何使值的整数范围依赖于其他元素?

问题描述 投票:0回答:0

这是我第二次问这个问题: 在 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)"/>

所以在这一点上,我相当无能为力,也很困惑如何去做。你能帮帮我吗?

xml xsd integer attributes assert
© www.soinside.com 2019 - 2024. All rights reserved.