<xsl:stylesheet xmlns:xx="http://xml.sandre.eaufrance.fr/scenario/referentiel/3.1" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:sch="http://www.ascc.net/xml/schematron" xmlns:axsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="text" omit-xml-declaration="no" standalone="yes" indent="yes"/>
    <xsl:template match="*|@*" mode="schematron-get-full-path">
        <xsl:apply-templates select="parent::*" mode="schematron-get-full-path"/>
        <xsl:text>/</xsl:text>
        <xsl:if test="count(. | ../@*) = count(../@*)">@</xsl:if>
        <xsl:value-of select="name()"/>
        <xsl:text>[</xsl:text>
        <xsl:value-of select="1+count(preceding-sibling::*[name()=name(current())])"/>
        <xsl:text>]</xsl:text>
    </xsl:template>
    <xsl:template match="/">
        <xsl:apply-templates select="/" mode="M0"/>
        <xsl:apply-templates select="/" mode="M1"/>
        <xsl:apply-templates select="/" mode="M2"/>
    </xsl:template>
    
     <!--VERIFICATION DES CODES DOUBLONS APPELLATION DE TAXON-->
    <xsl:key name="CdAppelTaxon" match="xx:AppelTaxon" use="xx:CdAppelTaxon"/>
    <xsl:key name="NomLatinAppelTaxon" match="xx:AppelTaxon[./xx:StAppelTaxon='Validé']" use="xx:NomLatinAppelTaxon"/>
    <!--
    <xsl:template match="/xx:REFERENTIELS/xx:Referentiel/xx:AppelTaxon" mode="M1">
        <xsl:choose>
            <xsl:when test="count(//xx:REFERENTIELS/xx:Referentiel/xx:AppelTaxon[preceding::xx:AppelTaxon/xx:CdAppelTaxon/text()=xx:CdAppelTaxon/text()])=0"/>
            <xsl:otherwise>
        E3.1/Le code Sandre '<xsl:value-of select="./xx:CdAppelTaxon/text()"/>' (statut <xsl:value-of select="./xx:StAppelTaxon/text()"/>)' est un doublon.#
        </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
    -->
    <!-- détection des doublons code sandre -->
    <xsl:template match="/xx:REFERENTIELS/xx:Referentiel/xx:AppelTaxon[ not(generate-id() = generate-id(key('CdAppelTaxon', xx:CdAppelTaxon)[1]))]" priority="3996" mode="M0">
        A99.3.1/Le code Sandre '<xsl:value-of select="./xx:CdAppelTaxon/text()"/>' dont le nom latin est '<xsl:value-of select="./xx:NomLatinAppelTaxon/text()"/>' (statut <xsl:value-of select="./xx:StAppelTaxon/text()"/>)<xsl:text>' est un doublon.#
        </xsl:text>
    </xsl:template>   
    <!-- détection des doublons de nom latin -->
    <xsl:template match="/xx:REFERENTIELS/xx:Referentiel/xx:AppelTaxon[ (./xx:StAppelTaxon='Validé') and not(generate-id() = generate-id(key('NomLatinAppelTaxon', xx:NomLatinAppelTaxon)[1]))]" priority="3996" mode="M1">A3.1/Le nom latin '<xsl:value-of select="./xx:NomLatinAppelTaxon/text()"/>' dont le code Sandre est '<xsl:value-of select="./xx:CdAppelTaxon/text()"/>' (statut <xsl:value-of select="./xx:StAppelTaxon/text()"/>)<xsl:text>' est un doublon.#
        </xsl:text>
    </xsl:template>
    <!-- contrôle que le taxon parent existe -->
    <xsl:template match="/xx:REFERENTIELS/xx:Referentiel/xx:AppelTaxon[./xx:AppelTaxonParent/xx:CdAppelTaxon and not(key('CdAppelTaxon', ./xx:AppelTaxonParent/xx:CdAppelTaxon))]" priority="3996" mode="M2">
        <xsl:text>A99.3.1/Le nom latin '</xsl:text>
        <xsl:value-of select="./xx:NomLatinAppelTaxon/text()"/>' dont le code sandre est '<xsl:value-of select="./xx:CdAppelTaxon/text()"/>' (statut <xsl:value-of select="./xx:StAppelTaxon/text()"/>)<xsl:text> à un AppelTaxonParent</xsl:text> '<xsl:value-of select="./xx:AppelTaxonParent/xx:NomLatinAppelTaxon/text()"/>' dont le code sandre est '<xsl:value-of select="./xx:AppelTaxonParent/xx:CdAppelTaxon/text()"/>' qui n'est pas publié.#    
    </xsl:template>
    <!-- contrôle que le taxon référent du synonyme existe -->
    <xsl:template match="/xx:REFERENTIELS/xx:Referentiel/xx:AppelTaxon[./xx:EstSynonyme/xx:CdAppelTaxon and not(key('CdAppelTaxon', ./xx:EstSynonyme/xx:CdAppelTaxon))]" priority="3996" mode="M2">
        <xsl:text>A99.3.1/Le nom latin '</xsl:text>
        <xsl:value-of select="./xx:NomLatinAppelTaxon/text()"/>' dont le code sandre est '<xsl:value-of select="./xx:CdAppelTaxon/text()"/>' (statut <xsl:value-of select="./xx:StAppelTaxon/text()"/>)<xsl:text> a un EstSynonyme</xsl:text> '<xsl:value-of select="./xx:EstSynonyme/xx:NomLatinAppelTaxon/text()"/>' dont le code sandre est '<xsl:value-of select="./xx:EstSynonyme/xx:CdAppelTaxon/text()"/>' qui n'est pas publié.#        
    </xsl:template>
    <xsl:template match="text()" priority="-1" mode="M0"/>
    <xsl:template match="text()" priority="-1" mode="M1"/>
    <xsl:template match="text()" priority="-1" mode="M2"/>
    <xsl:template match="text()" priority="-1"/>
</xsl:stylesheet>