Feature: s9api-basierte SaxonWorkerPool-Variante für XSLT 2.0/3.0

Die JAXP-basierte SaxonWorkerPool-Implementierung ist nur für XSLT 1.0
vollständig spezifiziert und kann bei XSLT 2.0/3.0 zu fehlerhaften
Ausgaben führen.

Änderungen:
- Neue SaxonWorkerPoolS9Api-Klasse mit Saxon s9api für XSLT 2.0/3.0
- XsltVersion-Enum in conf.py (XSLT_1_0, XSLT_2_0_3_0)
- ComboBox in Performance-Einstellungen zur XSLT-Version-Auswahl
- MainWindow wählt automatisch richtige Worker-Pool-Variante
- Verbesserte Classpath-Behandlung und Fehlerbehandlung

Standard-Einstellung: XSLT 2.0/3.0 (s9api) - empfohlen für moderne Stylesheets
Fallback: XSLT 1.0 (JAXP) - verfügbar für Legacy-Stylesheets

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-05 20:20:00 +01:00
parent 6976d21768
commit cbcae3222f
7 changed files with 605 additions and 22 deletions
+47 -7
View File
@@ -15,17 +15,17 @@ from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor,
QFont, QFontDatabase, QGradient, QIcon,
QImage, QKeySequence, QLinearGradient, QPainter,
QPalette, QPixmap, QRadialGradient, QTransform)
from PySide6.QtWidgets import (QAbstractButton, QApplication, QCheckBox, QDialog,
QDialogButtonBox, QFrame, QGroupBox, QHBoxLayout,
QHeaderView, QLabel, QPushButton, QSizePolicy,
QSpacerItem, QSpinBox, QTabWidget, QTableWidget,
QTableWidgetItem, QVBoxLayout, QWidget)
from PySide6.QtWidgets import (QAbstractButton, QApplication, QCheckBox, QComboBox,
QDialog, QDialogButtonBox, QFrame, QGroupBox,
QHBoxLayout, QHeaderView, QLabel, QPushButton,
QSizePolicy, QSpacerItem, QSpinBox, QTabWidget,
QTableWidget, QTableWidgetItem, QVBoxLayout, QWidget)
class Ui_Dialog(object):
def setupUi(self, Dialog):
if not Dialog.objectName():
Dialog.setObjectName(u"Dialog")
Dialog.resize(833, 446)
Dialog.resize(833, 526)
self.verticalLayout = QVBoxLayout(Dialog)
self.verticalLayout.setObjectName(u"verticalLayout")
self.tabSettings = QTabWidget(Dialog)
@@ -336,6 +336,27 @@ class Ui_Dialog(object):
self.verticalLayout_11.addWidget(self.checkBoxUseSaxonPool)
self.horizontalLayoutXsltVersion = QHBoxLayout()
self.horizontalLayoutXsltVersion.setObjectName(u"horizontalLayoutXsltVersion")
self.labelXsltVersion = QLabel(self.groupBoxSaxonPool)
self.labelXsltVersion.setObjectName(u"labelXsltVersion")
self.horizontalLayoutXsltVersion.addWidget(self.labelXsltVersion)
self.comboBoxXsltVersion = QComboBox(self.groupBoxSaxonPool)
self.comboBoxXsltVersion.addItem("")
self.comboBoxXsltVersion.addItem("")
self.comboBoxXsltVersion.setObjectName(u"comboBoxXsltVersion")
self.horizontalLayoutXsltVersion.addWidget(self.comboBoxXsltVersion)
self.horizontalSpacerXsltVersion = QSpacerItem(40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum)
self.horizontalLayoutXsltVersion.addItem(self.horizontalSpacerXsltVersion)
self.verticalLayout_11.addLayout(self.horizontalLayoutXsltVersion)
self.labelSaxonPoolInfo = QLabel(self.groupBoxSaxonPool)
self.labelSaxonPoolInfo.setObjectName(u"labelSaxonPoolInfo")
self.labelSaxonPoolInfo.setWordWrap(True)
@@ -363,6 +384,10 @@ class Ui_Dialog(object):
self.verticalLayout_9.addWidget(self.groupBoxFopPool)
self.verticalSpacer = QSpacerItem(20, 40, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding)
self.verticalLayout_9.addItem(self.verticalSpacer)
self.label = QLabel(self.tabPerformance)
self.label.setObjectName(u"label")
self.label.setMouseTracking(True)
@@ -392,7 +417,7 @@ class Ui_Dialog(object):
self.buttonBox.accepted.connect(Dialog.accept)
self.buttonBox.rejected.connect(Dialog.reject)
self.tabSettings.setCurrentIndex(0)
self.tabSettings.setCurrentIndex(7)
QMetaObject.connectSlotsByName(Dialog)
@@ -438,6 +463,21 @@ class Ui_Dialog(object):
"\u2022 Sie die Funktion testen m\u00f6chten", None))
#endif // QT_CONFIG(tooltip)
self.checkBoxUseSaxonPool.setText(QCoreApplication.translate("Dialog", u"SaxonWorkerPool verwenden (empfohlen)", None))
self.labelXsltVersion.setText(QCoreApplication.translate("Dialog", u"XSLT-Version:", None))
self.comboBoxXsltVersion.setItemText(0, QCoreApplication.translate("Dialog", u"XSLT 1.0 (JAXP)", None))
self.comboBoxXsltVersion.setItemText(1, QCoreApplication.translate("Dialog", u"XSLT 2.0/3.0 (s9api) - Empfohlen", None))
#if QT_CONFIG(tooltip)
self.comboBoxXsltVersion.setToolTip(QCoreApplication.translate("Dialog", u"W\u00e4hlen Sie die XSLT-Version f\u00fcr Saxon-Transformationen:\n"
"\n"
"XSLT 1.0 (JAXP): Verwendet die JAXP Transformer API\n"
"\u2022 Nur f\u00fcr XSLT 1.0 vollst\u00e4ndig spezifiziert\n"
"\u2022 Kann bei XSLT 2.0/3.0 zu fehlerhaften Ausgaben f\u00fchren\n"
"\n"
"XSLT 2.0/3.0 (s9api): Verwendet die Saxon s9api\n"
"\u2022 Vollst\u00e4ndige Unterst\u00fctzung f\u00fcr XSLT 2.0 und 3.0\n"
"\u2022 Empfohlen f\u00fcr moderne XSLT-Stylesheets", None))
#endif // QT_CONFIG(tooltip)
self.labelSaxonPoolInfo.setText(QCoreApplication.translate("Dialog", u"<i>Hinweis: SaxonWorkerPool ben\u00f6tigt ein JDK (Java Development Kit).<br>Mit JRE allein werden Transformationen im Fallback-Modus ausgef\u00fchrt.</i>", None))
self.groupBoxFopPool.setTitle(QCoreApplication.translate("Dialog", u"FopWorkerPool Einstellungen", None))
#if QT_CONFIG(tooltip)