XSL Transformation von XML-Dokumenten per PowerShell

Anlehnend an den XML-Beitrag vom 28. Juli 2012 gibt es jetzt noch die Variante einer XSL-Transformation () über die . Das Ganze dient der einfachen Umwandlung einer etwas unpassenden -Struktur in eine passendere. Über die lässt sich das Ganze dann auch etwas besser automatisieren und kann bspw. auch als Task eingeplant werden.

Was wir für diese Aktion brauchen, ist eigentlich nur unser XML-Dokument (Quelldatei) und die XSLT-Datei für die Transformation. Das PowerShell-Script liest beide Dokumente ein, führt die Transformation durch und gibt dann ein neues, etwas besser strukturiertes XML-Dokument aus.

Ich habe es so erstellt, dass man beim Aufruf vom Script (*.ps1) bereits die entsprechenden Parameter (Quelle | XSLT | Ziel) mit angeben kann. Es kann dabei auch nur jeweils ein einzelner Parameter angegeben werden. Wenn man hingegen gar nichts angibt, werden die Standardeinträge im Quellcode genutzt. Sollte die Zieldatei der Transformation noch nicht existieren, wird sie angelegt und gefüllt.


Beispiel 1
Transform.ps1outPathD:\Neu.xml
Transformiert das im Script angegebene Quell-XML-Dokument mit der XSLT-Datei, die ebenfalls im Script angegeben ist und erstellt eine neue XML-Datei, wie über Parameter -outPath angegeben.

Beispiel 2
Transform.ps1XMLE:\Quelle.xml“ –xsltE:\Trans.xslt“ –outPathD:\Neu.xml
Transformiert das per Parameter -XML angegebene Quell-XML-Dokument mit der XSLT-Datei, die über den Parameter -xslt angegeben wurde und erstellt eine neue XML-Datei deren Pfad und Name über den Parameter -outPath angegeben wurde.

Hier ist das Script:

# Sinn: XML-Transformation mit einer XSLT-Datei zu einem neuen XML-Dokument
# Aufruf der *.ps1 [XML-QuellDatei] [XSLT-TransformationsDatei] [Output-XML-Pfad+Datei]
# Pfad+Dateinamen können beim Aufruf als Parameter übergeben werden, ..
# .. sonst werden die im Script festgelegten Pfade genutzt

# Parameterinitialisierung
param
 (
  $xml = „d:\test\check.xml“, # Parameter1 bei Aufruf des Programms über CMD
  $xslt = „d:\test\check.xslt“, # Parameter2 bei Aufruf des Programms über CMD
  $outPath = „d:\test\check_out.xml“ # Parameter3 … über CMD
 )

# Erstellung einer Funktion für die XML-XSLT-Transformation
function XSLT-Transformation($Path_XmlFile, $Path_XsltFile, $Path_Output)
{
 # Parameterinitialisierung
 # resolve-path löst Platzhalterzeichen im Pfad auf
 # Test-Path bestimmt, ob alle Elemente eines Pfads vorhanden sind
# Test-Path liefert TRUE, wenn Pfad okay ist
 $Path_XsltFile = resolve-path $Path_XsltFile 

 if(!(test-path $Path_XsltFile) ) # Wenn Pfad nicht existiert… 
{
  throw „Fehler: „, $Path_XsltFile ,“ wurde nicht gefunden!“
 }

 $Path_XmlFile = resolve-path $Path_XmlFile

 if(!(test-path $Path_XmlFile) )
 {
  throw „Fehler: „, $Path_XmlFile ,“ wurde nicht gefunden!“
 }

 # split-path gibt den übergeordneten Container des Pfads zurück
# .. also Pfad, ohne Dateinamen
 if(!(test-path (resolve-path(split-path $Path_Output))) )
{
  throw „Fehler: Pfad „, (split-path $Path_Output) ,“ ist nicht verfügbar!“ 

 } else {
  # wenn Pfad okay, dann erstelle XML-Output
  # „| out-null“ verhindert diese Standart-Ausgabe nach der Erstellung
  (New-Item -type „file“ -path $Path_Output -force) | out-null

  # löse Platzhalterzeichen noch auf
  $Path_Output = (resolve-path $Path_Output)
}

 # Wert vom Errorreporting in Var $EAP merken
 $EAP = $ErrorActionPreference

 # kurzzeitig das Errorreporting abschalten
 $ErrorActionPreference = „SilentlyContinue“

 # XSL-Objekt erstellen
 $script:xslt = new-object system.xml.xsl.xslcompiledtransform
 trap [System.Management.Automation.PSArgumentException]
 {
  $ErrorActionPreference = $EAP # Errorreporting auf alten, gemerkten Wert setzen
  $script:xslt = new-object system.xml.xsl.xsltransform
 }
 $ErrorActionPreference = $EAP # Errorreporting auf alten, gemerkten Wert setzen

 $Xslt.Load( $Path_XsltFile ) # Xslt-Datei laden
 $Xslt.Transform( $Path_XmlFile, $Path_Output ) # XSLT-Transformation ausführen

 Write-Host „Transformation erfolgreich!“
 Write-Host „Datei „,(split-path $Path_Output -leaf),
      “ wurde unter „,(split-path $Path_Output),“ erstellt!“
}

# Funktionsaufruf zur Transformation
XSLT-Transformation $xml $xslt $outPath

Kommentar verfassen

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.