Hierarchische XSL-Parameter-Sammlung implementiert

XML-Transformationen berücksichtigen jetzt alle XSLT-Parameter der übergeordneten
TreeNodes, nicht nur die des direkten XslFile-Knotens. Tiefere Ebenen überschreiben
höhere Ebenen (XslFile hat höchste Priorität).

Änderungen:
- _collect_parent_params(): Bug-Fix für korrekte Prioritätsreihenfolge
- _create_transformation_job(): Hierarchische Parameter-Sammlung mit TreeWidgetItem-Kontext
- _transform_xml_file() und _transform_xsl_file(): Weitergabe des TreeWidgetItem-Kontexts
- Verbessertes Logging mit logger statt print()

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

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
2025-12-14 15:59:37 +01:00
parent 2f7d5b5431
commit 03449b2fb9
+47 -23
View File
@@ -2169,39 +2169,43 @@ class MainWindow(QMainWindow):
def _collect_parent_params(self, item):
"""
Sammelt die XSLT-Parameter aller Eltern-Nodes.
Sammelt die XSLT-Parameter aller Eltern-Nodes von der Wurzel bis zum angegebenen Item.
Parameter werden von oben nach unten gesammelt, wobei tiefere Ebenen höhere Priorität haben.
Args:
item: Das TreeWidgetItem
item: Das TreeWidgetItem (kann TreeNode oder XslFile sein)
Returns:
dict: Dictionary mit allen Eltern-Parametern
dict: Dictionary mit allen gesammelten Parametern (tiefere Ebenen überschreiben höhere)
"""
parent_params = {}
try:
# Gehe die Hierarchie nach oben durch
# Sammle alle Eltern-Items in einer Liste (von unten nach oben)
parents = []
current_item = item.parent()
while current_item:
# Hole das Node-Objekt
parent_node = current_item.data(0, Qt.ItemDataRole.UserRole)
if parent_node and hasattr(parent_node, "xslt_params") and parent_node.xslt_params:
# Füge die Parameter des Eltern-Nodes hinzu
# Eltern-Parameter haben niedrigere Priorität (werden überschrieben)
for key, value in parent_node.xslt_params.items():
if key not in parent_params: # Nur hinzufügen wenn noch nicht vorhanden
parent_params[key] = value
# Gehe zum nächsten Eltern-Element
parents.append(current_item)
current_item = current_item.parent()
print(f"Gesammelte Eltern-Parameter: {parent_params}")
# Kehre Liste um, sodass wir von Wurzel zu Kind iterieren
parents.reverse()
# Sammle Parameter von Wurzel zu Kind (Kind überschreibt Eltern)
for parent_item in parents:
parent_node = parent_item.data(0, Qt.ItemDataRole.UserRole)
if parent_node and hasattr(parent_node, "xslt_params") and parent_node.xslt_params:
# Update überschreibt vorherige Werte (höhere Priorität für tiefere Ebenen)
parent_params.update(parent_node.xslt_params)
logger.debug(f"Gesammelte Eltern-Parameter: {parent_params}")
return parent_params
except Exception as e:
print(f"Fehler beim Sammeln der Eltern-Parameter: {e}")
logger.error(f"Fehler beim Sammeln der Eltern-Parameter: {e}")
return {}
def _save_project_settings(self):
@@ -3008,8 +3012,8 @@ class MainWindow(QMainWindow):
QMessageBox.warning(self, "Fehler", "Konnte XML-Datei nicht ermitteln")
return
# Erstelle TransformationJob
job = self._create_transformation_job(xsl_file_obj, xml_file_obj)
# Erstelle TransformationJob mit TreeWidgetItem-Kontext für Parameter-Sammlung
job = self._create_transformation_job(xsl_file_obj, xml_file_obj, parent_item)
if not job:
return
@@ -3044,7 +3048,8 @@ class MainWindow(QMainWindow):
# Erstelle TransformationJobs für alle XML-Dateien
jobs = []
for xml_file_obj in xsl_file_obj.xmls:
job = self._create_transformation_job(xsl_file_obj, xml_file_obj)
# Übergebe das XslFile-TreeWidgetItem für Parameter-Sammlung
job = self._create_transformation_job(xsl_file_obj, xml_file_obj, item)
if job:
jobs.append(job)
@@ -3059,13 +3064,16 @@ class MainWindow(QMainWindow):
logger.error(f"Fehler beim Transformieren der XSL-Datei: {e}")
QMessageBox.critical(self, "Fehler", f"Fehler beim Transformieren: {str(e)}")
def _create_transformation_job(self, xsl_file_obj: XslFile, xml_file_obj: XmlFile) -> TransformationJob | None:
def _create_transformation_job(
self, xsl_file_obj: XslFile, xml_file_obj: XmlFile, xsl_file_item: QTreeWidgetItem | None = None
) -> TransformationJob | None:
"""
Erstellt einen TransformationJob für eine XML/XSL-Kombination.
Args:
xsl_file_obj: Das XslFile-Objekt
xml_file_obj: Das XmlFile-Objekt
xsl_file_item: Optional das TreeWidgetItem des XslFile für hierarchische Parameter-Sammlung
Returns:
TransformationJob oder None bei Fehler
@@ -3125,11 +3133,27 @@ class MainWindow(QMainWindow):
# Erstelle absoluten Pfad zur XSL-Datei
xsl_file_abs = xsl_dir.path_to_root_dir / xsl_file_obj.xsl_file
# Sammle XSLT-Parameter (kombiniere TreeNode + XslFile Parameter)
# Sammle XSLT-Parameter hierarchisch (TreeNode-Eltern → XslFile)
xslt_params = {}
# TODO: Hier könnten TreeNode-Parameter von übergeordneten Knoten gesammelt werden
# 1. Sammle Parameter von übergeordneten TreeNodes (falls TreeWidgetItem verfügbar)
if xsl_file_item is not None:
parent_params = self._collect_parent_params(xsl_file_item)
xslt_params.update(parent_params)
logger.debug(f"Hierarchische Parameter gesammelt: {parent_params}")
else:
logger.warning(
"Kein TreeWidgetItem-Kontext verfügbar - "
"übergeordnete TreeNode-Parameter werden nicht berücksichtigt"
)
# 2. Überschreibe mit XslFile-eigenen Parametern (höchste Priorität)
xslt_params.update(xsl_file_obj.xslt_params)
logger.info(
f"Finale XSLT-Parameter für {xml_file_obj.xml} mit {xsl_file_obj.bez}: {xslt_params}"
)
# Erstelle TransformationJob
job = TransformationJob(
project_dir=self.project.project_dir,