Значение диапазона является комплексным типом, который позволяет определять точные величины (с опциональным аргументом "эпсилон"), интервалы, открытые слева или справа, и диапазоны. Все данные числа имеют тип xsd:double. UpperBoundedRanges and LowerBoundedRanges задают верхнюю и нижнюю границы соответственно. Диапазоны могут быть "неограниченными" в смысле либо отрицательной, либо положительной бесконечности, в зависимости от возможностей потребляющей системы. Например, применительно к Java, "бесконечность" может выражаться как java.lang.Double. NEGATIVE_INFINITY и java.lang.Double.POSITIVE_INFINITY соответственно.
Если опциональный атрибут exclusiveBound не определен, то он имеет значение "false".
Если опциональный атрибут "epsilon" не определен, то он имеет значение 0, и потребляющая система должна использовать точное совпадение, отвечающее максимально возможной точности представления числа на данной потребляющей системе. Если атрибут "epsilon" определен, то его величина определяет допустимую точность сравнения данного значения в отличие от элемента "Exact". Таким образом, элемент "Exact" при заданном значении атрибута "epsilon" определяет диапазон "[значение-epsilon, значение+epsilon]". Значение "epsilon" не должно быть отрицательным.
Значения диапазона величин, определяющие пересекающиеся диапазоны, могут быть стянуты вместе потребляющей системой, для того чтобы соответствовать описанию задачи, однако при этом документ JSDL не должен быть изменен.
Этот тип обязан поддерживаться потребляющей системой. Формальная семантика совпадений определена в следующем разделе (7.2.5.1).
7.2.5.1 Семантика совпадений
Должна использоваться следующая семантика совпадений:
- численное значение N попадает в диапазон R тогда и только тогда, если выполнено хотя бы одно из следующих условий (имеет значение "true"):
- R содержит UpperBoundedRange U, атрибут exclusiveBound имеет значение "false" и NU;
- R содержит UpperBoundedRange U, атрибут exclusiveBound имеет значение "true" и N<U;
- R содержит LowerBoundedRange L, атрибут exclusiveBound имеет значение "false" и NL;
- R содержит LowerBoundedRange L, атрибут exclusiveBound имеет значение "true" и N>L;
- R содержит "Exact" Е с атрибутом "epsilon", равным е, и Е-еЕ+е;
- R содержит диапазон Range с LowerBound L и UpperBound U, и следующие два выражения истинны:
- L имеет атрибут exclusiveBound, равный "false", и NL либо L имеет атрибут exclusiveBound, равный "true", и N>L;
- U имеет атрибут exclusiveBound, равный "false", и NL либо U имеет атрибут exclusiveBound, равный "true", и N<L.
7.2.5.2 Псевдосхема
<UpperBoundedRange exclusiveBound="xsd:boolean"?>
xsd:double
</UpperBoundedRange>?
<LowerBoundedRange exclusiveBound="xsd:boolean"?>
xsd:double
</LowerBoundedRange>?
<Exact epsilon="xsd:double"?>
xsd:double
</Exact>*
<Range>
<LowerBound exclusiveBound="xsd:boolean"?>
xsd:double
</LowerBound>
<UpperBound exclusiveBound="xsd:boolean"?>
xsd:double
</UpperBound>
</Range>*
7.2.5.3 Примеры
Псевдовыражение "5, 6.7777, 7.0, [50.3,99.5), [100-", которое определяет неперекрывающийся диапазон, содержащий следующие значения: 5, 6.7777, 7.0, все величины от 50.3 включительно до 99.5, не включая последнее, и все величины от 100 и более, может быть описано при помощи RangeValue следующим образом:
<jsdl:LowerBoundedRange> 100.0 </jsdl:LowerBoundedRange>
<jsdl:Exact> 5.0 </jsdl:Exact>
<jsdl:Exact epsilon="0.00001"> 6.7777 </jsdl:Exact>
<jsdl:Exact> 7.0 </jsdl:Exact>
<jsdl:Range>
<jsdl:LowerBound> 50.3 </jsdl:LowerBound>
<jsdl:UpperBound exclusiveBound="true"> 99.5 </jsdl:UpperBound>
</jsdl:Range>