Bei einer mehrstufigen Transformation möchte man bei der Entwicklung leicht die Zwischenschritte überprüfen können. Dabei hilft eine andere Skriptsprache, wie bspw. Python Programmiersprachen Python . Das folgende Skript nimmt die XML Daten in einem Ordner input , transformiert diese in Sortierreihenfolge mit den XSLT Skripten, die im Ordner xslt liegen und schreibt die Ausgabe übersichtlich in den Ordner output .
import glob, os, shutil, getopt, sys, subprocess
SAXON_JAR = "/mnt/c/saxon/saxon9pe_98.jar"
JAVA_CMD = "java"
def transform():
for fpath in glob.glob('input/*'):
file_name= os.path.basename(fpath)
input_folder = os.path.dirname(os.path.realpath(fpath))
input_file = os.path.join(input_folder, file_name)
steps = os.listdir("xslt")
steps.sort()
step = None
for step_file in steps:
if not step_file.startswith("step"): continue
step = step_file.split("_")[0]
output_folder = input_folder.replace("input","output/"+step)
current_step = os.path.join(output_folder, file_name)
os.makedirs(output_folder,exist_ok=True)
args = [
JAVA_CMD,
"-classpath",
SAXON_JAR,
"net.sf.saxon.Transform",
"-s:"+input_file,
"-o:"+current_step,
"-xsl:xslt/"+step_file,
"filename="+os.path.basename(input_file).replace(".xml","")
]
try:
subprocess.call(args)
except:
print ("ERROR: Could not transform file: "+fpath+" with: "+step_file)
input_file = current_step
print ("Transformed "+step+": "+fpath)
transform()
print ("Done")Plain TextDas Skript kann natürlich noch um weitere Funktionen erweitert werden, wie bspw. einer Validierung für den letzten Schritt oder einem Deltavergleich der Zwischenergebnisse mit denen des vorherigen Transformationslaufs.
Will man das Ganze noch weiter treiben, kann man auch eine BPMN Engine Business Process Management Camunda BPMN Engine , wie Camunda verwenden (einen speziellen Task-Executor für Camunda, der genau für diese XML Zwecke gemacht wurde, findet man auch in meinem Github Repository).