<!--2011-04-28 ajout du controle de Luhn pour la verification de la validité des codes SIRET
    ajout de la verification des codes gelés--><!--2013-10-24 Ajout de la règle d'avertissement de contrôle du jeu de données de référence des stations de mesures cours d'eau, plan d'eau--><!--2014-04-28 Ajout du fichier de configuration STQ_simplifie pour le controle des stations de mesure QES --><!--2014-04-29 Ajout du fichier ODP_simplifie pour le controle des systèmes de traitement d'eaux usées--><!--2015-04-14 Optimisation des règles de controle de validation des paramètres, unités de mesure, supports et fractions analysées--><!--2018-09-07 Ajout de la vérification des intervenants --><!--2025-10-21 ajout des règles liés aux référentiels des commémoratifs--><axsl:stylesheet xmlns:xx="http://xml.sandre.eaufrance.fr/scenario/labo_dest/1" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:sch="http://www.ascc.net/xml/schematron" xmlns:sa_ref="http://xml.sandre.eaufrance.fr/scenario/referentiel/2" xmlns:sa_ref31="http://xml.sandre.eaufrance.fr/scenario/referentiel/3.1" xmlns:axsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <axsl:output method="text" omit-xml-declaration="no" standalone="yes" indent="yes"/>
    <!--<axsl:variable name="chemin">http://195.220.97.105:8080/exist/xmldb/db/sandre/Referentiels/old_referentiel.xml</axsl:variable>-->
    <axsl:variable name="cheminPAR">http://xml.sandre.eaufrance.fr/exist/sandre/Referentiels/PAR.xml</axsl:variable>
    <axsl:variable name="cheminMET">http://xml.sandre.eaufrance.fr/exist/sandre/Referentiels/MET.xml</axsl:variable>
    <axsl:variable name="cheminSUP">http://xml.sandre.eaufrance.fr/exist/sandre/Referentiels/SUP.xml</axsl:variable>
    <axsl:variable name="cheminFAN">http://xml.sandre.eaufrance.fr/exist/sandre/Referentiels/FAN.xml</axsl:variable>
    <axsl:variable name="cheminURF">http://xml.sandre.eaufrance.fr/exist/sandre/Referentiels/URF.xml</axsl:variable>
    <axsl:variable name="cheminINT">http://xml.sandre.eaufrance.fr/exist/sandre/Referentiels/INT.xml</axsl:variable>
    <axsl:variable name="cheminODP">http://xml.sandre.eaufrance.fr/exist/sandre/Referentiels/3.1/ODP_simplifie.xml</axsl:variable>
    <axsl:variable name="cheminSTQ">http://xml.sandre.eaufrance.fr/exist/sandre/Referentiels/3.1/STQ_simplifie.xml</axsl:variable>
    <axsl:variable name="cheminSCL">http://xml.sandre.eaufrance.fr/exist/sandre/Referentiels/3.1/SCL.xml</axsl:variable>
    <axsl:variable name="cheminNSA">http://xml.sandre.eaufrance.fr/exist/sandre/Referentiels/NSA.xml</axsl:variable>
    <axsl:variable name="cheminCMM">http://xml.sandre.eaufrance.fr/exist/sandre/Referentiels/CMM.xml</axsl:variable>
    <axsl:variable name="cheminDC">http://xml.sandre.eaufrance.fr/exist/sandre/Referentiels/DC.xml</axsl:variable>
    <axsl:variable name="testPar">
        <axsl:for-each select="document($cheminPAR)//sa_ref:Referentiel/sa_ref:Parametre">
            <axsl:text>'</axsl:text>
            <axsl:value-of select="./sa_ref:CdParametre/text()"/>
            <axsl:text>-</axsl:text>
            <axsl:value-of select="./sa_ref:StParametre/text()"/>
            <axsl:text>'</axsl:text>
            <axsl:if test="position()!=last()">
                <axsl:text>, </axsl:text>
            </axsl:if>
        </axsl:for-each>
    </axsl:variable>
    <axsl:variable name="testMet">
        <axsl:for-each select="document($cheminMET)//sa_ref:Referentiel/sa_ref:Methode">
            <axsl:text>'</axsl:text>
            <axsl:value-of select="./sa_ref:CdMethode/text()"/>
            <axsl:text>-</axsl:text>
            <axsl:value-of select="./sa_ref:StMethode/text()"/>
            <axsl:text>'</axsl:text>
            <axsl:if test="position()!=last()">
                <axsl:text>, </axsl:text>
            </axsl:if>
        </axsl:for-each>
    </axsl:variable>
    <axsl:variable name="testSup">
        <axsl:for-each select="document($cheminSUP)//sa_ref:Referentiel/sa_ref:Support">
            <axsl:text>'</axsl:text>
            <axsl:value-of select="./sa_ref:CdSupport/text()"/>
            <axsl:text>-</axsl:text>
            <axsl:value-of select="./sa_ref:StSupport/text()"/>
            <axsl:text>'</axsl:text>
            <axsl:if test="position()!=last()">
                <axsl:text>, </axsl:text>
            </axsl:if>
        </axsl:for-each>
    </axsl:variable>
    <axsl:variable name="testFan">
        <axsl:for-each select="document($cheminFAN)//sa_ref:Referentiel/sa_ref:FractionAnalysee">
            <axsl:text>'</axsl:text>
            <axsl:value-of select="./sa_ref:CdFractionAnalysee/text()"/>
            <axsl:text>-</axsl:text>
            <axsl:value-of select="./sa_ref:StFractionAnalysee/text()"/>
            <axsl:text>'</axsl:text>
            <axsl:if test="position()!=last()">
                <axsl:text>, </axsl:text>
            </axsl:if>
        </axsl:for-each>
    </axsl:variable>
    <axsl:variable name="testUrf">
        <axsl:for-each select="document($cheminURF)//sa_ref:Referentiel/sa_ref:UniteReference">
            <axsl:text>'</axsl:text>
            <axsl:value-of select="./sa_ref:CdUniteReference/text()"/>
            <axsl:text>-</axsl:text>
            <axsl:value-of select="./sa_ref:StUniteReference/text()"/>
            <axsl:text>'</axsl:text>
            <axsl:if test="position()!=last()">
                <axsl:text>, </axsl:text>
            </axsl:if>
        </axsl:for-each>
    </axsl:variable>
        <axsl:variable name="testINT">
        <axsl:for-each select="document($cheminINT)//sa_ref:Referentiel/sa_ref:Intervenant">
            <axsl:text>'</axsl:text>
            <axsl:value-of select="./sa_ref:CdIntervenant/text()"/>
            <axsl:text>-</axsl:text>
            <axsl:value-of select="./sa_ref:StIntervenant/text()"/>
            <axsl:text>'</axsl:text>
            <axsl:if test="position()!=last()">
                <axsl:text>, </axsl:text>
            </axsl:if>
        </axsl:for-each>
    </axsl:variable>
    <axsl:template match="*|@*" mode="schematron-get-full-path">
        <axsl:apply-templates select="parent::*" mode="schematron-get-full-path"/>
        <axsl:text>/</axsl:text>
        <axsl:if test="count(. | ../@*) = count(../@*)">@</axsl:if>
        <axsl:value-of select="name()"/>
        <axsl:text>[</axsl:text>
        <axsl:value-of select="1+count(preceding-sibling::*[name()=name(current())])"/>
        <axsl:text>]</axsl:text>
    </axsl:template>
    <axsl:template match="/">
        <axsl:apply-templates select="/" mode="M1"/>
    </axsl:template>

    <axsl:template match="//*[name()='CdParametre']" priority="4000" mode="M1">
        <axsl:variable name="valueTestPar">
            <axsl:text>'</axsl:text>
            <axsl:value-of select="current()"/>
            <axsl:text>-Validé'</axsl:text>
        </axsl:variable>
        <axsl:variable name="valueTestParGelé">
            <axsl:text>'</axsl:text>
            <axsl:value-of select="current()"/>
            <axsl:text>-Gelé'</axsl:text>
        </axsl:variable>
        <axsl:choose>
            <axsl:when test="contains($testPar, $valueTestPar)"/>
            <axsl:otherwise>
                <axsl:choose>
                    <axsl:when test="contains($testPar, $valueTestParGelé)">A3.2/Le code '<axsl:value-of select="text()"/>' est gelé au regard de la liste de référence des paramètres.#
	</axsl:when>
                    <axsl:otherwise>E3.1/Le code '<axsl:value-of select="text()"/>' est inconnu au regard de la liste de référence des paramètres.#
	</axsl:otherwise>
                </axsl:choose>
            </axsl:otherwise>
        </axsl:choose>
        <axsl:apply-templates mode="M1"/>
    </axsl:template>
    <axsl:template match="*[local-name()='CdMethode']" priority="3999" mode="M1">
        <axsl:variable name="valueTestMet">
            <axsl:text>'</axsl:text>
            <axsl:value-of select="current()"/>
            <axsl:text>-Validé'</axsl:text>
        </axsl:variable>
        <axsl:variable name="valueTestMetGelé">
            <axsl:text>'</axsl:text>
            <axsl:value-of select="current()"/>
            <axsl:text>-Gelé'</axsl:text>
        </axsl:variable>
        <axsl:choose>
            <axsl:when test="contains($testMet, $valueTestMet)"/>
            <axsl:otherwise>
                <axsl:choose>
                    <axsl:when test="contains($testMet, $valueTestMetGelé)"> A3.2/Le code '<axsl:value-of select="text()"/>' est gelé au regard de la liste de référence des méthodes.#
	</axsl:when>
                    <axsl:otherwise>E3.1/Le code '<axsl:value-of select="text()"/>' est inconnu au regard de la liste de référence des méthodes.#
	</axsl:otherwise>
                </axsl:choose>
            </axsl:otherwise>
        </axsl:choose>
        <axsl:apply-templates mode="M1"/>
    </axsl:template>
    <axsl:template match="*[name()='CdSupport']" priority="3998" mode="M1">
        <axsl:variable name="valueTestSup">
            <axsl:text>'</axsl:text>
            <axsl:value-of select="current()"/>
            <axsl:text>-Validé'</axsl:text>
        </axsl:variable>
        <axsl:variable name="valueTestSupGelé">
            <axsl:text>'</axsl:text>
            <axsl:value-of select="current()"/>
            <axsl:text>-Gelé'</axsl:text>
        </axsl:variable>
        <axsl:choose>
            <axsl:when test="contains($testSup, $valueTestSup)"/>
            <axsl:otherwise>
                <axsl:choose>
                    <axsl:when test="contains($testSup, $valueTestSupGelé)">A3.2/Le code '<axsl:value-of select="text()"/>' est gelé au regard de la liste de référence des supports.#
	</axsl:when>
                    <axsl:otherwise>E3.1/Le code '<axsl:value-of select="text()"/>' est inconnu au regard de la liste de référence des supports.#
	</axsl:otherwise>
                </axsl:choose>
            </axsl:otherwise>
        </axsl:choose>
        <axsl:apply-templates mode="M1"/>
    </axsl:template>
    <axsl:template match="*[local-name()='CdUniteReference']" priority="3997" mode="M1">
        <axsl:variable name="valueTestUrf">
            <axsl:text>'</axsl:text>
            <axsl:value-of select="current()"/>
            <axsl:text>-Validé'</axsl:text>
        </axsl:variable>
        <axsl:variable name="valueTestUrfGelé">
            <axsl:text>'</axsl:text>
            <axsl:value-of select="current()"/>
            <axsl:text>-Gelé'</axsl:text>
        </axsl:variable>
        <axsl:choose>
            <axsl:when test="contains($testUrf, $valueTestUrf)"/>
            <axsl:otherwise>
                <axsl:choose>
                    <axsl:when test="contains($testUrf, $valueTestUrfGelé)">A3.2/Le code '<axsl:value-of select="text()"/>' est gelé au regard de la liste de référence des unités de mesure.#
	</axsl:when>
                    <axsl:otherwise>E3.1/Le code '<axsl:value-of select="text()"/>' est inconnu au regard de la liste de référence des unités de mesure.#
	</axsl:otherwise>
                </axsl:choose>
            </axsl:otherwise>
        </axsl:choose>
        <axsl:apply-templates mode="M1"/>
    </axsl:template>
    <axsl:template match="*[local-name()='CdUniteMesure']" priority="3997" mode="M1">
        <axsl:variable name="valueTestUrf">
            <axsl:text>'</axsl:text>
            <axsl:value-of select="current()"/>
            <axsl:text>-Validé'</axsl:text>
        </axsl:variable>
        <axsl:variable name="valueTestUrfGelé">
            <axsl:text>'</axsl:text>
            <axsl:value-of select="current()"/>
            <axsl:text>-Gelé'</axsl:text>
        </axsl:variable>
        <axsl:choose>
            <axsl:when test="contains($testUrf, $valueTestUrf)"/>
            <axsl:otherwise>
                <axsl:choose>
                    <axsl:when test="contains($testUrf, $valueTestUrfGelé)">A3.2/Le code '<axsl:value-of select="text()"/>' est gelé au regard de la liste de référence des unités de mesure.#
	</axsl:when>
                    <axsl:otherwise>E3.1/Le code '<axsl:value-of select="text()"/>' est inconnu au regard de la liste de référence des unités de mesure.#
	</axsl:otherwise>
                </axsl:choose>
            </axsl:otherwise>
        </axsl:choose>
        <axsl:apply-templates mode="M1"/>
    </axsl:template>
    <axsl:template match="*[local-name()='CdFractionAnalysee']" priority="3996" mode="M1">
        <axsl:variable name="valueTestFan">
            <axsl:text>'</axsl:text>
            <axsl:value-of select="current()"/>
            <axsl:text>-Validé'</axsl:text>
        </axsl:variable>
        <axsl:variable name="valueTestFanGelé">
            <axsl:text>'</axsl:text>
            <axsl:value-of select="current()"/>
            <axsl:text>-Gelé'</axsl:text>
        </axsl:variable>
        <axsl:choose>
            <axsl:when test="contains($testFan, $valueTestFan)"/>
            <axsl:otherwise>
                <axsl:choose>
                    <axsl:when test="contains($testFan, $valueTestFanGelé)">A3.2/Le code '<axsl:value-of select="text()"/>' est gelé au regard de la liste de référence des fractions analysées.#
	</axsl:when>
                    <axsl:otherwise>E3.1/Le code '<axsl:value-of select="text()"/>' est inconnu au regard de la liste de référence des fractions analysées.#
	</axsl:otherwise>
                </axsl:choose>
            </axsl:otherwise>
        </axsl:choose>
        <axsl:apply-templates mode="M1"/>
    </axsl:template>
    
  <!-- VERIFICATION DU JEU DE DONNEES DES STATIONS DE MESURE COURS D'EAU PLAN D'EAU -->
    <axsl:template match="/xx:LABO_DEST/xx:Demande/xx:Prelevement/xx:StationPrelevement/xx:CdStationPrelevement[./@schemeAgencyID='1']" priority="4000" mode="M1">
        <axsl:choose>
            <axsl:when test="document($cheminSTQ)//sa_ref31:Referentiel/sa_ref31:StationMesureEauxSurface/sa_ref31:CdStationMesureEauxSurface/text()=./text()">
                <axsl:if test="document($cheminSTQ)//sa_ref31:Referentiel/sa_ref31:StationMesureEauxSurface[./sa_ref31:CdStationMesureEauxSurface/text()=current()/text()]/sa_ref31:StStationMesure/text()='Gelé'">
                    A3.2/Avertissement: le code '<axsl:value-of select="./text()"/>' est gelé au regard de la liste de référence des stations de mesure QES (cours d'eau, plans d'eau)#
                </axsl:if>
            </axsl:when>
            <axsl:otherwise>A3.1/Avertissement: le code '<axsl:value-of select="./text()"/>' est inconnu au regard de la liste de référence des stations de mesure cours d'eau plans d'eau#
            </axsl:otherwise>
        </axsl:choose>
        <axsl:apply-templates mode="M1"/>
    </axsl:template>
    
<!-- VERIFICATION DU JEU DE DONNEES DES SYSTEMES DE TRAITEMENT DES EAUX USEES -->
    <axsl:template match="/xx:LABO_DEST/xx:Demande/xx:Prelevement/xx:StationPrelevement/xx:CdStationPrelevement[./@schemeAgencyID='5']" priority="4000" mode="M1">
        <axsl:choose>
            <axsl:when test="document($cheminODP)//sa_ref31:Referentiel/sa_ref31:OuvrageDepollution/sa_ref31:CdOuvrageDepollution/text()=./text()">
                <!--<axsl:if test="document($cheminODP)//sa_ref31:Referentiel/sa_ref31:OuvrageDepollution[./sa_ref31:CdOuvrageDepollution/text()=current()/text()]/sa_ref31:StStationMesure/text()='Gelé'">
                    A3.2/Avertissement: le code '<axsl:value-of select="./text()"/>' est gelé au regard de la liste de référence des stations de mesure QES (cours d'eau, plans d'eau)#
                </axsl:if>-->
            </axsl:when>
            <axsl:otherwise>A3.1/Avertissement: le code '<axsl:value-of select="./text()"/>' est inconnu au regard de la liste de référence des systèmes de traitement d'eaux usées en date du 2013-10-30#
            </axsl:otherwise>
        </axsl:choose>
        <axsl:apply-templates mode="M1"/>
    </axsl:template>
    <axsl:template match="*[local-name()='CdIntervenant'][./@schemeAgencyID='SIRET']" priority="4000" mode="M1">
    
      <axsl:variable name="valueTestINT">
            <axsl:text>'</axsl:text>
            <axsl:value-of select="current()"/>
            <axsl:text>-Validé'</axsl:text>
        </axsl:variable>
        <axsl:variable name="valueTestINTGelé">
            <axsl:text>'</axsl:text>
            <axsl:value-of select="current()"/>
            <axsl:text>-Gelé'</axsl:text>
        </axsl:variable>
        <axsl:choose>
            <axsl:when test="contains($testINT, $valueTestINT)"/>
            <axsl:otherwise>
                <axsl:choose>
                    <axsl:when test="contains($testINT, $valueTestINTGelé)">A3.2/Le code '<axsl:value-of select="text()"/>' est gelé au regard de la liste de référence des intervenants.#
	</axsl:when>
                    <axsl:otherwise>E3.1/Le code '<axsl:value-of select="text()"/>' est inconnu au regard de la liste de référence des intervenants.#
	</axsl:otherwise>
                </axsl:choose>
            </axsl:otherwise>
        </axsl:choose>
        
        <axsl:choose>
            <axsl:when test="string-length(text())!=14">
E4.47/Code SIRET '<axsl:value-of select="text()"/>'  erroné. Longueur de chiffres différent de 14.#
            </axsl:when>
        </axsl:choose>
        <axsl:call-template name="controle-luhn">
            <axsl:with-param name="numero" select="text()"/>
            <axsl:with-param name="somme" select="0"/>
            <axsl:with-param name="indice" select="1"/>
        </axsl:call-template>
        <axsl:apply-templates mode="M1"/>
    </axsl:template>
    <axsl:template name="controle-luhn">
        <axsl:param name="numero" select="normalize-space(.)"/>
        <axsl:param name="somme" select="0"/>
        <axsl:param name="indice" select="1"/>
        <axsl:choose>
            <axsl:when test="string-length($numero)=0">
                <!-- Nous arrivons ici après le dernier chiffre -->
                <axsl:choose>
                    <axsl:when test="$somme mod 10 = 0"/>
                    <axsl:otherwise>E3.3/Le code SIRET '<axsl:value-of select="text()"/>' est erroné au regard du contrôle de la formule de Luhn, la somme <axsl:value-of select="$somme"/> n'est pas un multiple de 10.#
                  </axsl:otherwise>
                </axsl:choose>
            </axsl:when>
                        <!-- test sur les 14 chiffres-->
           <!-- <axsl:when test="string-length(text())!=14">
E4.47/Code SIRET '<axsl:value-of select="text()"/>'  erroné. Longueur de chiffres différent de 14.#
            </axsl:when>-->
            <axsl:when test="$indice mod 2 = 0">
                <!-- Cas des chiffres d'indice pair -->
                <axsl:call-template name="controle-luhn">
                    <axsl:with-param name="numero" select="substring($numero, 2)"/>
                    <axsl:with-param name="somme" select="$somme + substring($numero, 1, 1)"/>
                    <axsl:with-param name="indice" select="$indice + 1"/>
                </axsl:call-template>
            </axsl:when>
            <axsl:otherwise>
                <!-- Cas des chiffres d'indice impair -->
                <axsl:variable name="double" select="concat(substring($numero, 1, 1) * 2, '0') "/>
                <axsl:call-template name="controle-luhn">
                    <axsl:with-param name="numero" select="substring($numero, 2)"/>
                    <axsl:with-param name="somme" select="$somme + substring($double, 1, 1) + substring($double, 2, 1)"/>
                    <axsl:with-param name="indice" select="$indice + 1"/>
                </axsl:call-template>
            </axsl:otherwise>
        </axsl:choose>
        <axsl:apply-templates mode="M1"/>
    </axsl:template>
    <!-- Template sur CdCommemoratif - version XSLT 1.0 -->
<xsl:template match="*[local-name()='CdCommemoratif']" priority="4000" mode="M1">
  <xsl:variable name="thisCdCom" select="normalize-space(.)"/>
  <xsl:variable name="typeComClean" select="     normalize-space(       document($cheminCMM)//sa_ref:Commemoratif[sa_ref:CdCommemoratif = $thisCdCom]/sa_ref:TypeCommemoratif     )   "/>

  <axsl:variable name="expectedParent">
    <axsl:choose>
      <axsl:when test="$typeComClean='PRL'">Prelevement</axsl:when>
      <axsl:when test="$typeComClean='DEM'">Demande</axsl:when>
      <axsl:when test="$typeComClean='ECH'">Echantillon</axsl:when>
      <axsl:when test="$typeComClean='ANA'">Analyse</axsl:when>
      <axsl:otherwise>UNKNOWN</axsl:otherwise>
    </axsl:choose>
  </axsl:variable>
  <axsl:if test="$expectedParent != 'UNKNOWN' and not(ancestor::*[local-name() = $expectedParent])">
      <axsl:text>E3.4/Commémoratif de type </axsl:text>
      <axsl:value-of select="$typeComClean"/>
      <axsl:text> (CdCommemoratif = '</axsl:text>
      <axsl:value-of select="$thisCdCom"/>
      <axsl:text>') doit se trouver dans </axsl:text>
      <axsl:value-of select="$expectedParent"/>
      <axsl:text>#</axsl:text>
    </axsl:if>
    
    <axsl:if test="$expectedParent != 'UNKNOWN' and ancestor::*[local-name() = $expectedParent] and not(local-name(../..) = $expectedParent)">
      <axsl:text>E3.5/Commémoratif de type </axsl:text>
      <axsl:value-of select="$typeComClean"/>
      <axsl:text> (CdCommemoratif = '</axsl:text>
      <axsl:value-of select="$thisCdCom"/>
      <axsl:text>') doit être directement enfant du parent attendu '</axsl:text>  
      <axsl:value-of select="$expectedParent"/>
      <axsl:text>', pas d'un sous-enfant#</axsl:text>
    </axsl:if>

  <xsl:choose>
    <xsl:when test="document($cheminCMM)//sa_ref:Referentiel/sa_ref:Commemoratif/sa_ref:CdCommemoratif = $thisCdCom">

      <!-- A3.10 : gelé -->
      <xsl:if test="document($cheminCMM)//sa_ref:Referentiel/sa_ref:Commemoratif                       [sa_ref:CdCommemoratif = $thisCdCom]/sa_ref:StCommemoratif = 'Gelé'">
        A3.10/AVERTISSEMENT: Le code '<xsl:value-of select="$thisCdCom"/>' est gelé au regard de la liste de référence des commémoratifs#
      </xsl:if>

      <!-- si DefCommemoratif contient 'N°' -->
      <xsl:if test="contains(document($cheminCMM)//sa_ref:Referentiel/sa_ref:Commemoratif[sa_ref:CdCommemoratif = $thisCdCom]/sa_ref:DefCommemoratif, 'N°')">

        <!-- extraire text brut après 'N°' -->
        <xsl:variable name="numNomRaw" select="normalize-space(substring-after(document($cheminCMM)//sa_ref:Referentiel/sa_ref:Commemoratif[sa_ref:CdCommemoratif = $thisCdCom]/sa_ref:DefCommemoratif, 'N°'))"/>

        <!-- token = premier mot après 'N°' -->
        <xsl:variable name="numNomToken" select="substring-before(concat($numNomRaw,' '),' ')"/>

        <!-- garder uniquement les chiffres -->
        <xsl:variable name="numNom" select="translate($numNomToken, translate($numNomToken, '0123456789',''), '')"/>

        <!-- Valeur à vérifier (dans le fichier testé) -->
        <xsl:variable name="valComRaw" select="normalize-space(../*[local-name()='ValCommemoratif'])"/>
        <xsl:variable name="valCom">
          <xsl:choose>
            <xsl:when test="contains($valComRaw, ':')">
              <xsl:value-of select="normalize-space(substring-after($valComRaw, ':'))"/>
            </xsl:when>
            <xsl:otherwise>
              <xsl:value-of select="$valComRaw"/>
            </xsl:otherwise>
          </xsl:choose>
        </xsl:variable>

        <!-- recherche du référentiel dans NSA -->
        <xsl:variable name="referentielNSA" select="document($cheminNSA)//sa_ref:Referentiel[sa_ref:CdReferentiel = $numNom]"/>
        <xsl:variable name="referentielCount" select="count($referentielNSA)"/>

        <!-- si NSA introuvable => message (seul cas où on émet ce message) -->
        <xsl:if test="$referentielCount = 0">
          <xsl:text>E3.1/Le code '</xsl:text>
          <xsl:value-of select="$numNom"/>
          <xsl:text>' est inconnu au regard de la liste de référence des nomenclatures#</xsl:text>
        </xsl:if>

        <!-- si NSA trouvé, vérifier la valeur dans CdElement -->
        <xsl:if test="$referentielCount &gt; 0">
          <xsl:variable name="nbMatch" select="count($referentielNSA/sa_ref:Element/sa_ref:CdElement[normalize-space(.) = $valCom])"/>


          <!-- si aucun CdElement ne correspond -->
          <xsl:if test="$nbMatch = 0">
            <xsl:text>E3.2/La valeur '</xsl:text>
            <xsl:value-of select="$valCom"/>
            <xsl:text>' n'est pas valide pour la nomenclature N°</xsl:text>
            <xsl:value-of select="$numNom"/>
            <xsl:text>#</xsl:text>
          </xsl:if>
        </xsl:if>
      </xsl:if>
    </xsl:when>
    <xsl:otherwise>
      E3.1/Le code '<xsl:value-of select="$thisCdCom"/>' est inconnu au regard de la liste de référence des commémoratifs#
    </xsl:otherwise>
  </xsl:choose>
<!-- Règle spécifique : CdCommemoratif = 130 ou 126 ou 38 -->
<xsl:if test=". = '130' or . = '126' or . = '38'">
  <xsl:variable name="valComRaw" select="normalize-space(../*[local-name()='ValCommemoratif'])"/>
  <xsl:variable name="valCom">
    <xsl:choose>
      <xsl:when test="contains($valComRaw, ':')">
        <xsl:value-of select="normalize-space(substring-after($valComRaw, ':'))"/>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="$valComRaw"/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:variable>

  <!-- Vérification que ValCommemoratif correspond à un CdMethode valide dans MET.xml -->
  <xsl:variable name="methodeNode" select="document($cheminMET)//sa_ref:Referentiel/sa_ref:Methode[normalize-space(sa_ref:CdMethode) = $valCom]"/>
  <xsl:variable name="nbMatchMet" select="count($methodeNode)"/>

  <xsl:if test="$nbMatchMet = 0">
    <xsl:text>E3.1/Le code '</xsl:text>
    <xsl:value-of select="$valCom"/>
    <xsl:text>' est inconnu au regard de la liste de référence des méthodes#</xsl:text>
  </xsl:if>

  <!-- Si la méthode est trouvée mais gelée -->
  <xsl:if test="$nbMatchMet &gt; 0 and $methodeNode/sa_ref:StMethode = 'Gelé'">
    <xsl:text>A3.10/AVERTISSEMENT: Le code '</xsl:text>
    <xsl:value-of select="$valCom"/>
    <xsl:text>' est gelé au regard de la liste de référence des méthodes#</xsl:text>
  </xsl:if>
</xsl:if>
<!-- Règle spécifique : CdCommemoratif = 131 ou 129 ou 128 -->
<xsl:if test=". = '131' or . = '129' or . = '128'">
  <xsl:variable name="valComRaw" select="normalize-space(../*[local-name()='ValCommemoratif'])"/>
  <xsl:variable name="valCom">
    <xsl:choose>
      <xsl:when test="contains($valComRaw, ':')">
        <xsl:value-of select="normalize-space(substring-after($valComRaw, ':'))"/>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="$valComRaw"/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:variable>

  <!-- Vérification que ValCommemoratif correspond à un CdParametre valide dans PAR.xml -->
  <xsl:variable name="parametreNode" select="document($cheminPAR)//sa_ref:Referentiel/sa_ref:Parametre[normalize-space(sa_ref:CdParametre) = $valCom]"/>
  <xsl:variable name="nbMatchPar" select="count($parametreNode)"/>

  <xsl:if test="$nbMatchPar = 0">
    <xsl:text>E3.1/Le code '</xsl:text>
    <xsl:value-of select="$valCom"/>
    <xsl:text>' est inconnu au regard de la liste de référence des paramètres#</xsl:text>
  </xsl:if>

  <!-- Si le paramètre est trouvé mais gelé -->
  <xsl:if test="$nbMatchPar &gt; 0 and $parametreNode/sa_ref:StParametre = 'Gelé'">
    <xsl:text>A3.10/AVERTISSEMENT: Le code '</xsl:text>
    <xsl:value-of select="$valCom"/>
    <xsl:text>' est gelé au regard de la liste de référence des paramètres#</xsl:text>
  </xsl:if>
</xsl:if>
<!-- Règle spécifique : CdCommemoratif = 123 -->
<xsl:if test=". = '123'">
  <xsl:variable name="valComRaw" select="normalize-space(../*[local-name()='ValCommemoratif'])"/>
  <xsl:variable name="valCom">
    <xsl:choose>
      <xsl:when test="contains($valComRaw, ':')">
        <xsl:value-of select="normalize-space(substring-after($valComRaw, ':'))"/>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="$valComRaw"/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:variable>

  <!-- Vérification que ValCommemoratif correspond à un CodeSandreRdd valide dans DC.xml -->
  <xsl:variable name="DispositifCollecteNode" select="document($cheminDC)//sa_ref:Referentiel/sa_ref:DispositifCollecte[normalize-space(sa_ref:CodeSandreRdd) = $valCom]"/>
  <xsl:variable name="nbMatchDispositifCollecte" select="count($DispositifCollecteNode)"/>

  <xsl:if test="$nbMatchDispositifCollecte = 0">
    <xsl:text>E3.1/Le code '</xsl:text>
    <xsl:value-of select="$valCom"/>
    <xsl:text>' est inconnu au regard de la liste de référence des dispositifs de collecte.#</xsl:text>
  </xsl:if>

  <!-- Si le dispositif de collecte est trouvé mais gelé -->
  <xsl:if test="$nbMatchDispositifCollecte &gt; 0 and $DispositifCollecteNode/sa_ref:StRdd = 'Gelé'">
    <xsl:text>A3.10/AVERTISSEMENT: Le code '</xsl:text>
    <xsl:value-of select="$valCom"/>
    <xsl:text>' est gelé au regard de la liste de référence des dispositifs de collecte#</xsl:text>
  </xsl:if>
</xsl:if>
  <xsl:apply-templates mode="M1"/>
</xsl:template>
    <axsl:template match="text()" priority="-1" mode="M1"/>
    <axsl:template match="text()" priority="-1"/>
</axsl:stylesheet>