Wiki

Clone wiki

best-practice / JoL Header - schematron

#!XML

<!-- Abstract patterns -->

<iso:pattern abstract="true" id="pattern.IITypeStrict">
    <iso:rule context="$path">
        <iso:assert test="(urn1:extension)">In $path extension must be given.</iso:assert>
    </iso:rule>
</iso:pattern>
<iso:pattern abstract="true" id="pattern.CVType">
    <iso:rule context="$path">
        <iso:assert test="count(urn1:code) + count(urn1:originalText) = 1">
            In $path, either code or originalText must be given.</iso:assert>
    </iso:rule>
    <iso:rule context="$path/urn1:code">
        <iso:assert test="count(../urn1:codeSystem) + count(../urn1:displayName) = 2">
            In $path if <iso:name/> is given, codeSystem and displayName must be given.</iso:assert>
        <iso:assert test="count(../urn1:originalText)= 0">
            In $path if <iso:name/> is given, originalText must not be given.</iso:assert>
    </iso:rule>
    <iso:rule context="$path/urn1:codeSystem">
        <iso:assert test="count(../urn1:code) + count(../urn1:displayName) = 2">
            In $path if <iso:name/> is given, code and displayName must be given.</iso:assert>
        <iso:assert test="count(../urn1:originalText)= 0">
            In $path if <iso:name/> is given, originalText must not be given.</iso:assert>
        <iso:assert test="matches(.,'^[0-2](\.([0-9])+)+$')">
            Element 'codeSystem' must be an OID for the current codeSystem.</iso:assert>
    </iso:rule>
    <iso:rule context="$path/urn1:displayName">
        <iso:assert test="count(../urn1:code) + count(../urn1:codeSystem) = 2">
            In $path if <iso:name/> is given, code and codeSystem must be given.</iso:assert>
        <iso:assert test="count(../urn1:originalText)= 0">
            In $path if <iso:name/> is given, originalText must not be given.</iso:assert>
    </iso:rule>
    <iso:rule context="$path/urn1:originalText">
        <iso:assert test="count(../urn1:code) + count(../urn1:codeSystem) + count(../urn1:displayName) = 0">
            In $path if <iso:name/> is given, code, codeSystem and displayName must not be given.</iso:assert>
    </iso:rule>
</iso:pattern>

<!-- Concrete rules implementing abstract patterns -->

<!-- Strict II types -->
<iso:pattern id="Verify_accessControlHeader.accountableHealthcareProvider.IIType" is-a="pattern.IITypeStrict">
    <iso:param name="path" value="urn1:accessControlHeader/urn1:accountableHealthcareProvider" />
</iso:pattern>
<iso:pattern id="Verify_accessControlHeader.accountableCareUnit.IIType" is-a="pattern.IITypeStrict">
    <iso:param name="path" value="urn1:accessControlHeader/urn1:accountableCareUnit" />
</iso:pattern>
<iso:pattern id="Verify_accessControlHeader.originalPatientId.IIType" is-a="pattern.IITypeStrict">
    <iso:param name="path" value="urn1:accessControlHeader/urn1:originalPatientId" />
</iso:pattern>
<iso:pattern id="Verify_header.sourceSystemId.IIType" is-a="pattern.IITypeStrict">
    <iso:param name="path" value="urn1:header/urn1:sourceSystemId" />
</iso:pattern>
<iso:pattern id="Verify_author.id.IIType" is-a="pattern.IITypeStrict">
    <iso:param name="path" value="urn1:author/urn1:id" />
</iso:pattern>
<iso:pattern id="Verify_signature.id.IIType" is-a="pattern.IITypeStrict">
    <iso:param name="path" value="urn1:signature/urn1:id" />
</iso:pattern>

<!-- CV types -->
<iso:pattern id="Verify_author.byRole.CVType" is-a="pattern.CVType">
    <iso:param name="path" value="urn1:author/urn1:byRole" />
</iso:pattern>
<iso:pattern id="Verify_signature.byRole.CVType" is-a="pattern.CVType">
    <iso:param name="path" value="urn1:signature/urn1:byRole" />
</iso:pattern>

<!-- Concrete rules -->

<iso:pattern id="Concrete rules">
    <iso:rule id="Verify_accessControlHeader.accountableHealthcareProvider.root" context="urn1:accessControlHeader/urn1:accountableHealthcareProvider">
        <iso:assert test="urn1:root/text()='1.2.752.129.2.1.4.1' or urn1:root/text()='1.2.752.29.4.3'">
            Only allowed value in element accessControlHeader/accountableHealthcareProvider/root is "1.2.752.129.2.1.4.1" and "1.2.752.29.4.3".
        </iso:assert>
    </iso:rule>
    <iso:rule id="Verify_accessControlHeader.accountableCareUnit.root" context="urn1:accessControlHeader/urn1:accountableCareUnit">
        <iso:assert test="urn1:root/text()='1.2.752.129.2.1.4.1'">
            Only allowed value in element accessControlHeader/accountableCareUnit/root is "1.2.752.129.2.1.4.1".
        </iso:assert>
    </iso:rule>
    <iso:rule id="Verify_accessControlHeader.author.id.root" context="urn1:accessControlHeader/urn1:author/urn1:id">
        <iso:assert test="urn1:root/text()='1.2.752.129.2.1.4.1'">
            Only allowed value in element accessControlHeader/author/id/root is "1.2.752.129.2.1.4.1".
        </iso:assert>
    </iso:rule>
    <iso:rule id="Verify_accessControlHeader.author.byRole.codeSystem" context="urn1:accessControlHeader/urn1:author/urn1:byRole">
        <iso:assert test="urn1:codeSystem/text()='1.2.752.129.2.2.1.4'">
            Only allowed value in element accessControlHeader/author/byRole/codeSystem is "1.2.752.129.2.2.1.4".
        </iso:assert>
    </iso:rule>
    <iso:rule id="Verify_accessControlHeader.signature.id.root" context="urn1:accessControlHeader/urn1:signature/urn1:id">
        <iso:assert test="urn1:root/text()='1.2.752.129.2.1.4.1'">
            Only allowed value in element accessControlHeader/signature/id/root is "1.2.752.129.2.1.4.1".
        </iso:assert>
    </iso:rule>
    <iso:rule id="Verify_accessControlHeader.signature.byRole.codeSystem" context="urn1:accessControlHeader/urn1:signature/urn1:byRole">
        <iso:assert test="urn1:codeSystem/text()='1.2.752.129.2.2.1.4'">
            Only allowed value in element accessControlHeader/signature/byRole/codeSystem is "1.2.752.129.2.2.1.4".
        </iso:assert>
    </iso:rule>
    <iso:rule id="Verify non-empty elements" context="soapenv:body//*">
        <iso:assert test="normalize-space(.)">Element <iso:name /> is included but empty. All elements included in the response must have valid values.</iso:assert>
    </iso:rule>
    <!-- Concrete rule based on naming of the contract -->
    <!-- TODO: Change "NameOfResponse" and "nameOfRespondingObject" to correspond to the naming of the contract -->
    <iso:rule id="Verify unique record id:s" context="urn:NameOfResponse">
        <let name="recordIdPath" value="urn:nameOfRespondingObject/urn1:header/urn1:record/urn1:id"/>
        <iso:assert test="count($recordIdPath) = count(distinct-values($recordIdPath))">Each record must have a unique id.</iso:assert>
    </iso:rule>
</iso:pattern>

Updated