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): 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: Args:
item: Das TreeWidgetItem item: Das TreeWidgetItem (kann TreeNode oder XslFile sein)
Returns: Returns:
dict: Dictionary mit allen Eltern-Parametern dict: Dictionary mit allen gesammelten Parametern (tiefere Ebenen überschreiben höhere)
""" """
parent_params = {} parent_params = {}
try: try:
# Gehe die Hierarchie nach oben durch # Sammle alle Eltern-Items in einer Liste (von unten nach oben)
parents = []
current_item = item.parent() current_item = item.parent()
while current_item: while current_item:
# Hole das Node-Objekt parents.append(current_item)
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
current_item = current_item.parent() 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 return parent_params
except Exception as e: except Exception as e:
print(f"Fehler beim Sammeln der Eltern-Parameter: {e}") logger.error(f"Fehler beim Sammeln der Eltern-Parameter: {e}")
return {} return {}
def _save_project_settings(self): def _save_project_settings(self):
@@ -3008,8 +3012,8 @@ class MainWindow(QMainWindow):
QMessageBox.warning(self, "Fehler", "Konnte XML-Datei nicht ermitteln") QMessageBox.warning(self, "Fehler", "Konnte XML-Datei nicht ermitteln")
return return
# Erstelle TransformationJob # Erstelle TransformationJob mit TreeWidgetItem-Kontext für Parameter-Sammlung
job = self._create_transformation_job(xsl_file_obj, xml_file_obj) job = self._create_transformation_job(xsl_file_obj, xml_file_obj, parent_item)
if not job: if not job:
return return
@@ -3044,7 +3048,8 @@ class MainWindow(QMainWindow):
# Erstelle TransformationJobs für alle XML-Dateien # Erstelle TransformationJobs für alle XML-Dateien
jobs = [] jobs = []
for xml_file_obj in xsl_file_obj.xmls: 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: if job:
jobs.append(job) jobs.append(job)
@@ -3059,13 +3064,16 @@ class MainWindow(QMainWindow):
logger.error(f"Fehler beim Transformieren der XSL-Datei: {e}") logger.error(f"Fehler beim Transformieren der XSL-Datei: {e}")
QMessageBox.critical(self, "Fehler", f"Fehler beim Transformieren: {str(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. Erstellt einen TransformationJob für eine XML/XSL-Kombination.
Args: Args:
xsl_file_obj: Das XslFile-Objekt xsl_file_obj: Das XslFile-Objekt
xml_file_obj: Das XmlFile-Objekt xml_file_obj: Das XmlFile-Objekt
xsl_file_item: Optional das TreeWidgetItem des XslFile für hierarchische Parameter-Sammlung
Returns: Returns:
TransformationJob oder None bei Fehler TransformationJob oder None bei Fehler
@@ -3125,11 +3133,27 @@ class MainWindow(QMainWindow):
# Erstelle absoluten Pfad zur XSL-Datei # Erstelle absoluten Pfad zur XSL-Datei
xsl_file_abs = xsl_dir.path_to_root_dir / xsl_file_obj.xsl_file 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 = {} 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) 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 # Erstelle TransformationJob
job = TransformationJob( job = TransformationJob(
project_dir=self.project.project_dir, project_dir=self.project.project_dir,