diff --git a/src/ui/MainWindow.py b/src/ui/MainWindow.py index 26a100e..598143d 100644 --- a/src/ui/MainWindow.py +++ b/src/ui/MainWindow.py @@ -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,