e-Belge Doğrulama & Dönüşüm Servisi: GİB UBL-TR Belgelerinizi Doğrulayın ve Görüntüleyin
Açık Kaynak28 Şubat 202615 dk

e-Belge Doğrulama & Dönüşüm Servisi: GİB UBL-TR Belgelerinizi Doğrulayın ve Görüntüleyin

Saxon HE motoru ile XML Schema/Schematron doğrulama ve XSLT dönüşüm mikroservisi. 6 XSD belge tipi, 8 Schematron tipi, 7 XSLT dönüşüm tipi, hot-reload, web arayüzü ve GİB paket otomatik sync desteği.

Mersel Açık Kaynak Ekibi

Yazar

e-Belge Doğrulama & Dönüşüm Servisi

Türkiye'nin e-Dönüşüm ekosisteminde her gün milyonlarca e-Fatura, e-İrsaliye, e-Arşiv ve e-Defter belgesi üretiliyor. Bu belgelerin GİB standartlarına uygunluğunu doğrulamak ve XML'den okunabilir HTML'e dönüştürmek kritik ihtiyaçlar. İşte tam da bu ihtiyaç için ebelge-xslt-service'i açık kaynak olarak yayınladık.

GitHub'da Açık Kaynak

ebelge-xslt-service — Java 21, Spring Boot 3.4, Saxon HE 12.x üzerine inşa edilmiş, MIT lisanslı açık kaynak proje. github.com/mersel-os/ebelge-xslt-service

Kurulum, yapılandırma veya production ortamına taşıma konusunda desteğe mi ihtiyacınız var? Ekibimizle iletişime geçin — projenizi birlikte hayata geçirelim. Tüm açık kaynak projelerimiz için açık kaynak sayfamızı ziyaret edin.

Ne İşe Yarar?

Bu servis üç temel fonksiyon sunar:

FonksiyonAçıklamaDesteklenen Tipler
XSD DoğrulamaXML Schema ile yapısal doğrulama6 belge tipi
Schematron Doğrulamaİş kuralı doğrulama8 Schematron tipi
XSLT DönüşümXML → HTML görüntüleme7 dönüşüm tipi

Belge türü, XML root element'inden SAX parser ile otomatik algılanır — tek zorunlu parametre dosyanın kendisidir.

Desteklenen Belge Tipleri

Schema (XSD) Doğrulama

TipAçıklama
INVOICEUBL 2.1 Fatura
DESPATCH_ADVICEUBL 2.1 İrsaliye
RECEIPT_ADVICEUBL 2.1 İrsaliye Yanıt
CREDIT_NOTEUBL 2.1 Müstahsil Makbuzu
FREELANCER_VOUCHERUBL 2.1 Serbest Meslek Makbuzu
EARCHIVE_REPORTE-Arşiv Rapor

Schematron Doğrulama

TipKaynakAçıklama
UBLTR_MAINRuntime derleme (XML)UBL-TR Ana Schematron
EARCHIVE_REPORTPre-compiled XSLE-Arşiv Rapor
EDEFTER_YEVMIYERuntime derleme (SCH)E-Defter Yevmiye
EDEFTER_KEBIRRuntime derleme (SCH)E-Defter Kebir
EDEFTER_BERATRuntime derleme (SCH)E-Defter Berat
EDEFTER_RAPORRuntime derleme (SCH)E-Defter Rapor
ENVANTER_BERATRuntime derleme (SCH)Envanter Berat
ENVANTER_DEFTERRuntime derleme (SCH)Envanter Defter

XSLT Dönüşüm

TipAçıklama
INVOICEE-Fatura
ARCHIVE_INVOICEE-Arşiv Fatura
DESPATCH_ADVICEE-İrsaliye
RECEIPT_ADVICEE-İrsaliye Yanıt
EMME-Müstahsil Makbuzu
ESMME-Serbest Meslek Makbuzu
ECHECKE-Adisyon

Mimari

Servis, temiz katmanlı bir mimariye sahiptir:

Proje Yapısı
MERSEL.Services.XsltService
├── xslt-web-api/Spring Boot REST API
├── xslt-web-ui/React + TailwindCSS + shadcn/ui
├── xslt-application/Arayüzler, modeller, enum'lar
├── xslt-infrastructure/Saxon HE implementasyonları
├── clients/dotnet-client/.NET İstemci SDK (NuGet)
├── monitoring/Prometheus + Grafana
└── custom-assets.example/External override örnek yapısı
BileşenTeknoloji
RuntimeJava 21 (LTS)
FrameworkSpring Boot 3.4
XSLT MotorSaxon HE 12.x (XSLT 3.0 / XPath 3.1)
XSD DoğrulamaJAXP (javax.xml.validation)
API DokümantasyonuSpringDoc OpenAPI + Scalar UI
MetriklerMicrometer + Prometheus
BuildGradle 8.12 (Kotlin DSL, multi-module)
TestJUnit 5 + AssertJ + Mockito + MockMvc + JaCoCo
ContainerDocker (multi-stage, JRE Alpine)

Hızlı Başlangıç

Yerel Geliştirme

git clone https://github.com/mersel-os/ebelge-xslt-service.git
cd ebelge-xslt-service

# Derle ve test et
./gradlew build

# Çalıştır — Schematron otomatik derlenir, hazır!
./gradlew :xslt-web-api:bootRun

Servis adresleri:

ServisAdres
APIhttp://localhost:8080
Scalar UIhttp://localhost:8080/scalar.html
Healthhttp://localhost:8080/actuator/health
Prometheushttp://localhost:8080/actuator/prometheus

Docker ile Çalıştırma

# Build ve çalıştır
docker compose up --build

# Veya sadece image oluştur
docker build -t mersel-xslt-service .
docker run -p 8080:8080 mersel-xslt-service

İlk çalıştırmada Schematron kuralları runtime'da ISO 3-adım pipeline ile otomatik derlenir. GİB UBL-TR ve e-Defter kaynak dosyalarından XSL çıktıları üretilir — ekstra bir adım gerekmez.

API Kullanımı

XML Doğrulama

Belge türü XML root element'inden otomatik tespit edilir. Tek zorunlu parametre source'dir.

# Temel doğrulama (belge türü otomatik tespit edilir)
curl -X POST http://localhost:8080/v1/validate \
  -F "source=@fatura.xml"

# Schematron parametreleri ile
curl -X POST http://localhost:8080/v1/validate \
  -F "source=@fatura.xml" \
  -F 'parameters=[{"key":"type","value":"efatura"},{"key":"sessionSupplierIdentification","value":"1234567890"}]'
ParametreZorunluAçıklama
sourceEvetDoğrulanacak XML belgesi
parametersHayırSchematron XSLT parametreleri (JSON array, maks 50)
profileHayırDoğrulama profili (örn: unsigned)
suppressionsHayırAd-hoc bastırma kuralları (virgülle ayrılmış)

Yanıt örneği:

{
  "result": {
    "validSchema": true,
    "validSchematron": false,
    "schemaValidationErrors": [],
    "schematronValidationErrors": [
      {
        "ruleId": "XadesSignatureCheck",
        "test": "ds:KeyInfo",
        "message": "ds:KeyInfo elemani zorunlu bir elemandir."
      }
    ]
  }
}

XSLT Dönüşüm

Başarılı dönüşümde ham HTML döner (text/html). Metadata, response header'larından okunur.

# Varsayılan XSLT ile
curl -v -X POST http://localhost:8080/v1/transform \
  -F "document=@fatura.xml" \
  -F "transformType=INVOICE"

# Belgenin kendi gömülü XSLT'si ile
curl -v -X POST http://localhost:8080/v1/transform \
  -F "document=@fatura.xml" \
  -F "transformType=INVOICE" \
  -F "useEmbeddedXslt=true"

# Özel XSLT + filigran ile
curl -v -X POST http://localhost:8080/v1/transform \
  -F "document=@fatura.xml" \
  -F "transformType=INVOICE" \
  -F "transformer=@ozel-sablon.xslt" \
  -F "watermarkText=TASLAK"

XSLT seçim önceliği: (1) transformer dosyası yüklendiyse onu kullan → (2) useEmbeddedXslt=true ve belgede gömülü XSLT varsa belgeden çıkar → (3) varsayılan XSLT şablonu.

Response HeaderAçıklama
X-Xslt-Default-UsedVarsayılan şablon kullanıldı mı
X-Xslt-Embedded-UsedGömülü XSLT kullanıldı mı
X-Xslt-Duration-Msİşlem süresi (ms)
X-Xslt-Watermark-AppliedFiligran uygulandı mı
X-Xslt-Output-SizeÇıktı boyutu (byte)

Doğrulama Profilleri

Doğrulama profilleri, belirli Schematron/XSD hatalarının bastırılmasını sağlar. En yaygın kullanım: imzasız belgelerin doğrulanması.

ProfilAçıklama
signedTam doğrulama — tüm kontroller aktif
unsignedİmzasız belge — imza kontrolleri bastırılıyor
(özel)Kendi profiliniz — extends ile miras alabilir

Bastırma Modları

ModHedefKararlılıkKullanım
ruleIdSoyut kural kimliğiEn yüksekRuntime derlenen Schematron'lar
testXPath test ifadesiYüksekRuntime derlenen Schematron'lar
textHata mesajı metni (regex)OrtaPre-compiled XSL'ler (fallback)

Profil YAML Yapısı

profiles:
  unsigned:
    description: "Imzasiz belge dogrulama"
    suppressions:
      - match: ruleId
        pattern: "XadesSignatureCheck"
        description: "XAdES imza kontrolu"
      - match: ruleId
        pattern: "SignatureCheck"
      - match: text
        pattern: ".*[Ii]mza.*"

  my-company:
    extends: unsigned          # unsigned'ın tüm kurallarını miras al
    description: "Firma ozel profili"
    suppressions:
      - match: ruleId
        pattern: "InvoiceIDCheck"
# Profil ile doğrulama
curl -X POST http://localhost:8080/v1/validate \
  -F "source=@fatura.xml" \
  -F "profile=unsigned"

# Profil + ad-hoc bastırma kuralları ile
curl -X POST http://localhost:8080/v1/validate \
  -F "source=@fatura.xml" \
  -F "profile=unsigned" \
  -F "suppressions=InvoiceIDCheck,text:.*organizationDescription.*"

Profiller custom-assets/validation-profiles.yml dosyasından yüklenir ve hot-reload ile restart gerektirmeden güncellenir. extends ile mevcut profillerden miras alarak firma bazlı özel profiller tanımlayabilirsiniz.

Özel Schematron Kuralları

Kod değişikliği yapmadan, admin panelinden veya API ile özel iş kuralları tanımlayabilirsiniz.

Her kural şu alanları içerir:

AlanAçıklama
Schematron TipiKuralın uygulanacağı Schematron (örn: UBL_TR_MAIN)
ContextXPath context ifadesi (örn: inv:Invoice)
TestXPath assert koşulu (örn: cbc:ID != '')
MesajHata mesajı — {{xpath}} placeholder'ları desteklenir
FlagHata seviyesi (error, warning, info)

Dinamik Parametreler

Kural test ifadelerinde $parametre_adi şeklinde değişkenler kullanılabilir. Bu değişkenler otomatik tanınır ve doğrulama isteğinde parameters alanı ile değerleri geçirilir.

Mesajlarda {{xpath}} Placeholder Desteği

Hata mesajlarında {{xpath_ifadesi}} syntax'i ile XML'deki değerleri doğrudan hata çıktısına yerleştirebilirsiniz:

Satıcı VKN ({{cac:AccountingSupplierParty/.../cbc:ID}}) oturumdaki firma
({{$sessionSupplierIdentification}}) ile eşleşmiyor.

Runtime'da {{...}} bloklarının yerine XML'den okunan gerçek değerler yerleştirilir:

Satıcı VKN (9876543210) oturumdaki firma (1234567890) ile eşleşmiyor.

Oturum Bazlı Fatura Sahipliği Kontrolü

Bu mekanizma ile yanlış firmaya ait faturalar doğrulama aşamasında reddedilerek iş katmanına hiç ulaşmaz. Admin panelinden tek bir kural tanımlayarak tüm faturalarınız için sahiplik kontrolü ekleyebilirsiniz.

GİB Paket Otomatik Sync

GİB resmi web sitesinden e-Fatura, UBL-TR XSD, e-Arşiv ve e-Defter paketlerini API ile otomatik indirir ve günceller.

# Tüm paketleri sync et
curl -X POST http://localhost:8080/v1/admin/packages/sync

# Belirli bir paketi sync et
curl -X POST http://localhost:8080/v1/admin/packages/sync?package=efatura

# Paket listesini gör
curl http://localhost:8080/v1/admin/packages
PaketHedef Dizin
UBL-TR Şematronvalidator/ubl-tr-package/schematron/
UBL-TR XSDvalidator/ubl-tr-package/schema/
e-Arşivvalidator/earchive/
e-Deftervalidator/eledger/

İlk kurulumda (auto-sync-on-startup) asset dizini boşken otomatik sync tetiklenir. Sonrasında API ile manuel veya schedule ile otomatik çalıştırılabilir.

Hot-Reload ve External Asset Override

Hot-Reload

Dosya değişikliğinde veya API ile restart gerektirmeden yeniden yükleme:

curl -X POST http://localhost:8080/v1/admin/assets/reload

External Asset Override

Servisin kullandığı XSD, XSLT ve Schematron dosyaları Docker volume mount ile dışarıdan beslenebilir:

docker run -p 8080:8080 \
  -v $(pwd)/custom-assets:/opt/xslt-assets:ro \
  -e XSLT_ASSETS_EXTERNAL_PATH=/opt/xslt-assets \
  -e XSLT_ASSETS_WATCH_ENABLED=true \
  mersel-xslt-service
ParametreEnv VariableVarsayılanAçıklama
xslt.assets.external-pathXSLT_ASSETS_EXTERNAL_PATH(boş)External asset dizini
xslt.assets.watch-enabledXSLT_ASSETS_WATCH_ENABLEDtrueDosya değişikliği izleme
xslt.assets.watch-debounce-msXSLT_ASSETS_WATCH_DEBOUNCE_MS500Debounce süresi (ms)

External dizinde bulunan dosyalar önceliklidir; bulunmayanlar için dahili (bundled) versiyonlar kullanılır.

Web Arayüzü

Tüm API işlemlerini grafiksel olarak sunabilen yerleşik bir web arayüzü ile gelir: React 19 + TypeScript, Vite 6, TailwindCSS 4 + shadcn/ui, Orval + Axios (OpenAPI codegen) ve TanStack Query v5.

SayfaAçıklama
DoğrulamaXML yükle, XSD/Schematron tipi seç, profil seç, parametreler geç, sonuçları incele
DönüşümXML yükle, dönüşüm tipi seç, filigran ekle, HTML önizleme
ProfillerDoğrulama profillerini listele, bastırma kurallarını incele, özel kural ekle
YönetimAsset yeniden yükle, GİB paket sync, XSLT şablon yönetimi, Schematron kural yönetimi
cd xslt-web-ui
pnpm install
pnpm dev          # http://localhost:5173 — API istekleri 8080'e proxy edilir
pnpm generate-api # OpenAPI'den API client üret

Monitoring

Prometheus + Grafana ile kapsamlı izleme:

cd monitoring
docker compose up -d
ServisAdres
Prometheushttp://localhost:9090
Grafanahttp://localhost:3000 (admin/admin)

Grafana dashboard 6 bölüm, 30+ panel içerir:

  • Genel Bakış — Servis durumu, toplam doğrulama/dönüşüm/hata, JVM heap
  • Doğrulama Metrikleri — İstek hızı, süre (p95), belge tipine göre dağılım, profil kullanımı
  • Dönüşüm Metrikleri — Tip bazlı istek hızı, süre (p95), çıktı boyutu, XSLT kaynağı dağılımı
  • Güvenlik ve Rate Limiting — Rate limit aşımları, giriş denemeleri
  • Operasyon — Asset reload, GİB paket sync, Schematron derleme
  • JVM ve Sistem — Heap/Non-Heap bellek, thread sayısı, GC duraklamaları

Production Profili

SPRING_PROFILES_ACTIVE=prod ile etkinleştirilir:

DavranışAçıklama
Admin Şifre ReddiVarsayılan changeme parolası kabul edilmez
Springdoc KapatmaSwagger/Scalar UI production'da devre dışı
Log SeviyesiRoot: WARN, uygulama: INFO
docker run -p 8080:8080 \
  -e SPRING_PROFILES_ACTIVE=prod \
  -e XSLT_ADMIN_PASSWORD=guclu-bir-sifre-buraya \
  mersel-xslt-service

Varsayılan admin parolası changeme'dir. Production ortamında mutlaka XSLT_ADMIN_PASSWORD ile değiştirin. prod profilinde varsayılan parola reddedilir.

Konfigürasyon Özeti

ParametreVarsayılanAçıklama
server.port8080HTTP port
spring.servlet.multipart.max-file-size110MBMaks dosya boyutu
xslt.limits.max-document-size-mb100Dönüşüm için maks belge boyutu
xslt.limits.max-validation-size-mb100Doğrulama için maks belge boyutu
xslt.rate-limit.enabledtrueRate limiting
xslt.rate-limit.validate30Doğrulama — dk başına maks istek
xslt.rate-limit.transform20Dönüşüm — dk başına maks istek

Sonuç

ebelge-xslt-service, e-Dönüşüm yazılımlarının en temel ihtiyaçlarından biri olan belge doğrulama ve görüntüleme problemini kapsamlı bir şekilde çözer. Özel Schematron kuralları, doğrulama profilleri, hot-reload, GİB paket sync ve web arayüzü ile sadece bir doğrulama motoru değil, tam bir e-Belge yönetim aracıdır.

MIT lisanslı ve açık kaynak. Katkılarınızı bekliyoruz.

Kurulum ve Entegrasyon Desteği

e-Belge doğrulama ve dönüşüm servisini kurmak, yapılandırmak veya mevcut altyapınıza entegre etmek için uzman ekibimizden destek alın.

Bize Ulaşın
Bu yazıyı paylaşın

Mersel'i Deneyin

12+ yıllık deneyimimizle e-Dönüşüm altyapınızı hazırlayalım.

İletişime Geçin