@echo off
rem $Id: saxon.cmd 1055 2026-04-03 13:01:03Z bertrand $
chcp 65001 >nul
if "%~1" == "" goto usage
if "%~2" == "" goto usage
set NORM_SELECTOR=%~1
set DOCUMENT_PATH=%~2
set JAR_PATH=C:\Data\Tools\Saxon\saxon-he-12.9.jar
set JAVA_PATH=C:\Program Files\Java\latest\jre-1.8\bin\java.exe
rem set XSD_PATH_0a_CII=C:\Data\Tools\FNFE-MPE\0a.CII_D22B_XSD\CrossIndustryInvoice_100pD22B.xsd
rem set XSD_PATH_0b=C:\Data\Tools\FNFE-MPE\0b.CDAR_D22B_XSD\CrossDomainAcknowledgementAndResponse_100pD22B.xsd
set XSL_PATH_1a_CII=C:\Data\Tools\FNFE-MPE\1a.EN16931_Schematrons_V1.3.15_CII_ET_UBL\_XSLT\EN16931-CII-validation.xslt
set XSL_PATH_1a_UBL=C:\Data\Tools\FNFE-MPE\1a.EN16931_Schematrons_V1.3.15_CII_ET_UBL\_XSLT\EN16931-UBL-validation.xslt
set XSL_PATH_1b_CII=C:\Data\Tools\FNFE-MPE\1b.EXTENDED-CTC-FR_Schematrons_V1.3.0_CII_ET_UBL\_XSLT\20260216_EXTENDED-CTC-FR-CII-V1.3.0.xsl
set XSL_PATH_1b_UBM=C:\Data\Tools\FNFE-MPE\1b.EXTENDED-CTC-FR_Schematrons_V1.3.0_CII_ET_UBL\_XSLT\20260216_EXTENDED-CTC-FR-UBL-V1.3.0.xsl
set XSL_PATH_1c=C:\Data\Tools\FNFE-MPE\1c.Factur-X_XSD_et_Schematrons_V1.08\3. Factur-X_1.08_EN16931\_XSLT_EN16931\FACTUR-X_EN16931.xslt
set XSL_PATH_2_CII=C:\Data\Tools\FNFE-MPE\2.BR-FR-CTC-Flux2-Schematron_UBL_ET_CII_FX\_XSLT\20260216_BR-FR-Flux2-Schematron-CII_V1.3.0.xsl
set XSL_PATH_2_UBL=C:\Data\Tools\FNFE-MPE\2.BR-FR-CTC-Flux2-Schematron_UBL_ET_CII_FX\_XSLT\20260216_BR-FR-Flux2-Schematron-UBL_V1.3.0.xsl
set XSL_PATH_3=C:\Data\Tools\FNFE-MPE\3.BR-FR-CDV_CDAR_V1.3.0\_XSLT\20260216_BR-FR-CDV-Schematron-CDAR_V1.3.0.xsl
set XSD_PATH=
set XSL_PATH=
rem if "%NORM_SELECTOR%"=="0a-CII" set XSD_PATH=%XSD_PATH_0a_CII%
rem if "%NORM_SELECTOR%"=="0b" set XSD_PATH=%XSD_PATH_0b%
if "%NORM_SELECTOR%"=="1a-CII" set XSL_PATH=%XSL_PATH_1a_CII%
if "%NORM_SELECTOR%"=="1a-UBL" set XSL_PATH=%XSL_PATH_1a_UBL%
if "%NORM_SELECTOR%"=="1b-CII" set XSL_PATH=%XSL_PATH_1b_CII%
if "%NORM_SELECTOR%"=="1b-UBL" set XSL_PATH=%XSL_PATH_1b_UBL%
if "%NORM_SELECTOR%"=="1c" set XSL_PATH=%XSL_PATH_1c%
if "%NORM_SELECTOR%"=="2-CII" set XSL_PATH=%XSL_PATH_2_CII%
if "%NORM_SELECTOR%"=="2-UBL" set XSL_PATH=%XSL_PATH_2_UBL%
if "%NORM_SELECTOR%"=="3" set XSL_PATH=%XSL_PATH_3%
set RES_PATH=%DOCUMENT_PATH%-%NORM_SELECTOR%-results.xml
rem Vérification de l'existence du document source
if not exist "%DOCUMENT_PATH%" goto src_file_not_found
if "%~3"=="verbose" echo Document source trouvé : "%DOCUMENT_PATH%"
rem Suppression du fichier de résultats, s'il existe
if exist "%RES_PATH%" del /f "%RES_PATH%"
rem Création de la ligne de commande
if "%XSD_PATH%"=="" (
	rem Vérification du l'existence du schéma de référence XSL/XSLT
	if "%XSL_PATH%"=="" goto unknown_norm_selector
	if not exist "%XSL_PATH%" goto xsl_file_not_found
	if "%~3"=="verbose" echo Schéma de référence trouvé : "%XSL_PATH%"
	set CMD="%JAVA_PATH%" -jar %JAR_PATH% -s:"%DOCUMENT_PATH%" -xsl:"%XSL_PATH%" -o:"%RES_PATH%"
) else (
	rem Vérification du l'existence du schéma de référence XSD
	if "%XSD_PATH%"=="" goto unknown_norm_selector
	if not exist "%XSD_PATH%" goto xsd_file_not_found
	if "%~3"=="verbose" echo Schéma de référence trouvé : "%XSD_PATH%"
	set CMD="%JAVA_PATH%" -jar %JAR_PATH% -s:"%DOCUMENT_PATH%" -xsd:%XSD_PATH% -o:"%RES_PATH%"
)
if "%~3"=="verbose" echo %CMD%
rem Exécution de la ligne de commande
echo Validation en cours du document "%DOCUMENT_PATH%" pour la norme "%NORM_SELECTOR%" ...
%CMD%
set RETVAL=%ERRORLEVEL%
rem Vérification de l'existence du fichier de résultat
if not exist "%RES_PATH%" goto res_file_not_found
if "%~3"=="verbose" echo Fichier de résultats trouvé : "%RES_PATH%"
rem Traitement du fichier de résultats
powershell -Command "[console]::InputEncoding = [console]::OutputEncoding = [System.Text.Encoding]::UTF8; $xml = [xml](Get-Content '%RES_PATH%' -Encoding UTF8); $errors = $xml.SelectNodes('//*[local-name()=''failed-assert'']'); if ($errors.Count -gt 0) { Write-Host '---------- Erreurs trouvées ----------' -ForegroundColor Red; $errors | ForEach-Object { $id = $_.id; $txt = $_.InnerText.Trim(); Write-Host ('[' + $id + '] ' + $txt) } } else { Write-Host '---------- Document validé -----------' -ForegroundColor Green }"
goto eos
rem -------------------------------------------------------------------
:usage
echo Utilisation : saxon norme document [verbose]
echo norme = 0a-CII,0b,1a-CII/1a-UBL/1b-CII/1b-UBL/1c/2-CII/2-UBL/3
echo document = Invoice_YYMMIIII.xml
set RETVAL=1
goto eos
rem -------------------------------------------------------------------
:src_file_not_found
echo Document source introuvable : "%DOCUMENT_PATH%"
set RETVAL=2
goto eos
rem -------------------------------------------------------------------
:xsl_file_not_found
echo Schéma de référence XSL/XSLT (%NORM_SELECTOR%) introuvable : "%XSL_PATH%"
set RETVAL=3
goto eos
rem -------------------------------------------------------------------
:xsd_file_not_found
echo Schéma de référence XSD (%NORM_SELECTOR%) introuvable : "%XSD_PATH%"
set RETVAL=4
goto eos
rem -------------------------------------------------------------------
:res_file_not_found
echo Fichier de résultats introuvable : "%RES_PATH%"
set RETVAL=5
goto eos
rem -------------------------------------------------------------------
:unknown_norm_selector
echo Schéma de référence inconnu : "%NORM_SELECTOR%"
set RETVAL=6
goto eos
rem -------------------------------------------------------------------
:eos
exit /b %RETVAL%
