<?xml version="1.0" encoding="UTF-8"?>
<!-- 
    DTR1 IVL - Interval
    Status: draft
-->
<rule abstract="true" id="IVL" xmlns="http://purl.oclc.org/dsdl/schematron">
    <extends rule="SXCM"/>

    <!--<assert role="error" test="(@nullFlavor and not(@value|@unit|*)) or (not(@nullFlavor) and (@value|@unit|hl7:low|hl7:center|hl7:high|hl7:width))" see="https://docs.art-decor.org/documentation/datatypes/DTr1_IVL"
        >dtr1-1-IVL: null violation. Cannot have @nullFlavor and @value or child elements, or the other way around</assert>
    <assert role="error" test="not(*[@nullFlavor and (@value|@unit)])" see="https://docs.art-decor.org/documentation/datatypes/DTr1_IVL"
        >dtr1-2-IVL: null violation. Cannot have @nullFlavor and @value on any child elements</assert>-->
    <assert role="error" test="not(descendant-or-self::*[@nullFlavor and (@value|@unit|hl7:low|hl7:center|hl7:high|hl7:width)])" see="https://docs.art-decor.org/documentation/datatypes/DTr1_IVL"
        >dtr1-3-IVL: null violation. Cannot have @nullFlavor and @value or other child elements</assert>
    
    <!-- unsure where this rule comes from KH 2016-07-22
    <assert role="error" test="@nullFlavor or descendant-or-self::*[@value]" see="https://docs.art-decor.org/documentation/datatypes/DTr1_IVL"
        >dtr1-4-1-IVL: co-occurence violation. Must have @nullFlavor or @value or child elements with @value</assert>
        -->
    <assert role="error" test="not(@value and (hl7:low|hl7:center|hl7:high|hl7:width))" see="https://docs.art-decor.org/documentation/datatypes/DTr1_IVL"
        >dtr1-4-2-IVL: co-occurence violation. Cannot have @value and child elements</assert>
    <assert role="error" test="not(hl7:center and (hl7:low|hl7:high|hl7:width))" see="https://docs.art-decor.org/documentation/datatypes/DTr1_IVL"
        >dtr1-4-3-IVL: co-occurence violation. Cannot have center and other elements</assert>
    <assert role="error" test="not(hl7:width and hl7:low and hl7:high)" see="https://docs.art-decor.org/documentation/datatypes/DTr1_IVL"
        >dtr1-4-4-IVL: co-occurence violation. Cannot have width and have both low and high elements</assert>
    
    <assert role="error" test="count(*[@updateMode])=0" see="https://docs.art-decor.org/documentation/datatypes/DTr1_IVL"
        >dtr1-5-IVL: no updateMode on IVL attributes</assert>
    
    <assert role="error" test="not(hl7:low[@nullFlavor='PINF'])" see="https://docs.art-decor.org/documentation/datatypes/DTr1_IVL"
        >dtr1-6-IVL: low must be lower than or equal to high. Found low boundary PINF (Positive Infinity)</assert>
    <assert role="error" test="not(hl7:high[@nullFlavor='NINF'])" see="https://docs.art-decor.org/documentation/datatypes/DTr1_IVL"
        >dtr1-7-IVL: low must be lower than or equal to high. Found high boundary NINF (Negative Infinity)</assert>

    <!-- Incorrect. See abstract datatypes §2.6.3 -->
    <!--<assert role="error" test="not(hl7:low/@value and hl7:high/@value) or hl7:low/@value != hl7:high/@value" see="https://docs.art-decor.org/documentation/datatypes/DTr1_IVL"
        >dtr1-6-IVL: low/@value must not be equal to high/@value</assert>-->

    <!-- width has datatype PQR, which extends CV ((){1}(((0[1-9])|([12]\d)|(3[01]))?)?)? -->
    <assert role="error" test="not(hl7:width) or hl7:width[not(@unit)] or hl7:width[@value and @unit]" see="https://docs.art-decor.org/documentation/datatypes/DTr1_IVL"
        >dtr1-1-PQR: width element: no unit without value</assert>
    <assert role="error" test="not(hl7:width/hl7:translation)" see="https://docs.art-decor.org/documentation/datatypes/DTr1_IVL"
        >dtr1-2-PQR: width element: no translation</assert>
</rule>
