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:
| Fonksiyon | Açıklama | Desteklenen Tipler |
|---|---|---|
| XSD Doğrulama | XML Schema ile yapısal doğrulama | 6 belge tipi |
| Schematron Doğrulama | İş kuralı doğrulama | 8 Schematron tipi |
| XSLT Dönüşüm | XML → HTML görüntüleme | 7 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
| Tip | Açıklama |
|---|---|
INVOICE | UBL 2.1 Fatura |
DESPATCH_ADVICE | UBL 2.1 İrsaliye |
RECEIPT_ADVICE | UBL 2.1 İrsaliye Yanıt |
CREDIT_NOTE | UBL 2.1 Müstahsil Makbuzu |
FREELANCER_VOUCHER | UBL 2.1 Serbest Meslek Makbuzu |
EARCHIVE_REPORT | E-Arşiv Rapor |
Schematron Doğrulama
| Tip | Kaynak | Açıklama |
|---|---|---|
UBLTR_MAIN | Runtime derleme (XML) | UBL-TR Ana Schematron |
EARCHIVE_REPORT | Pre-compiled XSL | E-Arşiv Rapor |
EDEFTER_YEVMIYE | Runtime derleme (SCH) | E-Defter Yevmiye |
EDEFTER_KEBIR | Runtime derleme (SCH) | E-Defter Kebir |
EDEFTER_BERAT | Runtime derleme (SCH) | E-Defter Berat |
EDEFTER_RAPOR | Runtime derleme (SCH) | E-Defter Rapor |
ENVANTER_BERAT | Runtime derleme (SCH) | Envanter Berat |
ENVANTER_DEFTER | Runtime derleme (SCH) | Envanter Defter |
XSLT Dönüşüm
| Tip | Açıklama |
|---|---|
INVOICE | E-Fatura |
ARCHIVE_INVOICE | E-Arşiv Fatura |
DESPATCH_ADVICE | E-İrsaliye |
RECEIPT_ADVICE | E-İrsaliye Yanıt |
EMM | E-Müstahsil Makbuzu |
ESMM | E-Serbest Meslek Makbuzu |
ECHECK | E-Adisyon |
Mimari
Servis, temiz katmanlı bir mimariye sahiptir:
| Bileşen | Teknoloji |
|---|---|
| Runtime | Java 21 (LTS) |
| Framework | Spring Boot 3.4 |
| XSLT Motor | Saxon HE 12.x (XSLT 3.0 / XPath 3.1) |
| XSD Doğrulama | JAXP (javax.xml.validation) |
| API Dokümantasyonu | SpringDoc OpenAPI + Scalar UI |
| Metrikler | Micrometer + Prometheus |
| Build | Gradle 8.12 (Kotlin DSL, multi-module) |
| Test | JUnit 5 + AssertJ + Mockito + MockMvc + JaCoCo |
| Container | Docker (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:
| Servis | Adres |
|---|---|
| API | http://localhost:8080 |
| Scalar UI | http://localhost:8080/scalar.html |
| Health | http://localhost:8080/actuator/health |
| Prometheus | http://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"}]'
| Parametre | Zorunlu | Açıklama |
|---|---|---|
source | Evet | Doğrulanacak XML belgesi |
parameters | Hayır | Schematron XSLT parametreleri (JSON array, maks 50) |
profile | Hayır | Doğrulama profili (örn: unsigned) |
suppressions | Hayır | Ad-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 Header | Açıklama |
|---|---|
X-Xslt-Default-Used | Varsayılan şablon kullanıldı mı |
X-Xslt-Embedded-Used | Gömülü XSLT kullanıldı mı |
X-Xslt-Duration-Ms | İşlem süresi (ms) |
X-Xslt-Watermark-Applied | Filigran 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ı.
| Profil | Açıklama |
|---|---|
signed | Tam 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ı
| Mod | Hedef | Kararlılık | Kullanım |
|---|---|---|---|
ruleId | Soyut kural kimliği | En yüksek | Runtime derlenen Schematron'lar |
test | XPath test ifadesi | Yüksek | Runtime derlenen Schematron'lar |
text | Hata mesajı metni (regex) | Orta | Pre-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:
| Alan | Açıklama |
|---|---|
| Schematron Tipi | Kuralın uygulanacağı Schematron (örn: UBL_TR_MAIN) |
| Context | XPath context ifadesi (örn: inv:Invoice) |
| Test | XPath assert koşulu (örn: cbc:ID != '') |
| Mesaj | Hata mesajı — {{xpath}} placeholder'ları desteklenir |
| Flag | Hata 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
| Paket | Hedef Dizin |
|---|---|
| UBL-TR Şematron | validator/ubl-tr-package/schematron/ |
| UBL-TR XSD | validator/ubl-tr-package/schema/ |
| e-Arşiv | validator/earchive/ |
| e-Defter | validator/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
| Parametre | Env Variable | Varsayılan | Açıklama |
|---|---|---|---|
xslt.assets.external-path | XSLT_ASSETS_EXTERNAL_PATH | (boş) | External asset dizini |
xslt.assets.watch-enabled | XSLT_ASSETS_WATCH_ENABLED | true | Dosya değişikliği izleme |
xslt.assets.watch-debounce-ms | XSLT_ASSETS_WATCH_DEBOUNCE_MS | 500 | Debounce 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.
| Sayfa | Açıklama |
|---|---|
| Doğrulama | XML yükle, XSD/Schematron tipi seç, profil seç, parametreler geç, sonuçları incele |
| Dönüşüm | XML yükle, dönüşüm tipi seç, filigran ekle, HTML önizleme |
| Profiller | Doğrulama profillerini listele, bastırma kurallarını incele, özel kural ekle |
| Yönetim | Asset 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
| Servis | Adres |
|---|---|
| Prometheus | http://localhost:9090 |
| Grafana | http://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 Reddi | Varsayılan changeme parolası kabul edilmez |
| Springdoc Kapatma | Swagger/Scalar UI production'da devre dışı |
| Log Seviyesi | Root: 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
| Parametre | Varsayılan | Açıklama |
|---|---|---|
server.port | 8080 | HTTP port |
spring.servlet.multipart.max-file-size | 110MB | Maks dosya boyutu |
xslt.limits.max-document-size-mb | 100 | Dönüşüm için maks belge boyutu |
xslt.limits.max-validation-size-mb | 100 | Doğrulama için maks belge boyutu |
xslt.rate-limit.enabled | true | Rate limiting |
xslt.rate-limit.validate | 30 | Doğrulama — dk başına maks istek |
xslt.rate-limit.transform | 20 | Dö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- GitHub: github.com/mersel-os/ebelge-xslt-service
- Detay Sayfası: Proje Detayları
- Lisans: MIT