2013-04-08 4 views
4

У меня есть файл XML:Использование PowerShell для преобразования XML в HTML

<?xml version="1.0" encoding="utf-8"?> 
<?xml-stylesheet type='text/xsl' href='file:///C:/Program%20Files/Application/log_format.xsl'?> 
<!DOCTYPE log [<!ENTITY data SYSTEM 'data/20130408.dat'>]> 
<log xmlns="runtime:log">&data;</log> 

XSL файл превращает его в HTML. Я не могу открыть файл в IE просто отлично и просмотреть ожидаемые результаты. Я бы хотел, чтобы с помощью скрипта PowerShell это преобразование получилось в виде простого HTML. Как я могу это сделать?

+1

http://devio.wordpress.com/2009/09/15/command-line-xslt-processor-with-powershell/ – austin

+1

С некоторым объяснением, выше комментарий должен быть ответ; возможно, принятый ответ (поскольку он не зависит от загрузки дополнительного модуля). – alroc

ответ

5

У этого blog entry есть фрагмент кода, который должен работать. Он использует класс System.Xml.Xsl.XslCompiledTransform .NET для преобразования XSL. Остальное - только для ввода и отображения вывода.

Это был изначально комментарий, но я думаю, что я сделаю это ответом, поэтому другим людям, ищущим решение, легче.

+0

идеальное решение, без кода, просто указывающее в правильном направлении :) –

2

PowerShell Community Extensions имеет Convert-Xml, который будет преобразовывать XSL в XML. Если результирующий файл недействителен HTML, вам необходимо работать с XSL-файлом.

0

Если вы хотите вернуть объект 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 
} 
Смежные вопросы