Если вы хотите вернуть объект xml вместо записи вывода в файл, чтобы вы могли делать больше операций в сети. это сработает. кроме того, я разбил создание процессора на отдельную функцию, чтобы вы могли его создать один раз и повторно использовать, что более дружественно к памяти.
function Invoke-TransformXML($path,$styleSheetPath,$output,$parameters, $compiledtransform)
{
if(! (test-path $path)) { Throw"XML input file not found: $path"}
$path = resolve-path $path
if (! (Test-Path $compiledtransform))
{
if(! ($compiledtransform.GetType() -eq [System.Xml.Xsl.XslCompiledTransform]))
{
$ctType = $compiledtransform.GetType() ;
Throw "Compiled transform is wrong type: $ctType"
}
else
{
$xslt = $compiledtransform
}
}
if (($compiledtransform -eq $null))
{
if(! (test-path $styleSheetPath) ) { Throw"XSL template file not found: $styleSheetPath"}
$styleSheetPath = Resolve-Path $styleSheetPath
$xslt = Get-CompiledTransform $styleSheetPath
}
$transformed = New-Object System.IO.MemoryStream
try
{
$xslt.Transform([string]$path, [System.Xml.Xsl.XsltArgumentList]$arglist, [System.IO.Stream]$transformed)
$transformed.Position = 0
#$reader = New-Object System.Xml.XmlTextReader($ms)
$outdoc = New-Object System.Xml.XmlDocument
$outdoc.Load($transformed)
# close stream, we are done with it
$transformed.Close()
return $outdoc
} Finally {
$transformed.Close()
}
}
function Get-CompiledTransform($styleSheetPath)
{
if(! (test-path $styleSheetPath) ) { Throw"XSL template file not found: $styleSheetPath"}
$styleSheetPath = Resolve-Path $styleSheetPath
if([System.Diagnostics.Debugger]::IsAttached)
{
$xslt = New-Object System.Xml.Xsl.XslCompiledTransform($true)
}
else
{
$xslt = New-Object System.Xml.Xsl.XslCompiledTransform($false)
}
$arglist = new-object System.Xml.Xsl.XsltArgumentList
foreach($param in $parms)
{
if ($parms.Name)
{
$paramName = $parms.Name
$paramNamespaceUri = $parms.NamespaceUri
$paramValue = $parms.Value
$arglist.AddParam($paramName, $paramNamespaceUri, $paramValue)
}
}
$xsltSettings = New-Object System.Xml.Xsl.XsltSettings($false,$true)
$xslt.Load($styleSheetPath, $xsltSettings, (New-Object System.Xml.XmlUrlResolver))
return $xslt
}
http://devio.wordpress.com/2009/09/15/command-line-xslt-processor-with-powershell/ – austin
С некоторым объяснением, выше комментарий должен быть ответ; возможно, принятый ответ (поскольку он не зависит от загрузки дополнительного модуля). – alroc