2013-04-08 55 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 2013-04-08 21:09:13

+1

有了一些解释,上面的评论应该是一个答案;可能是接受的答案(因为它不依赖于加载额外的模块)。 – alroc 2013-04-09 01:58:51

回答

5

这个blog entry有一个应该工作的代码片段。它使用.NET类来执行XSL转换。剩下的只是获取输入和显示输出。

这本来是一个评论,但我想我会让它成为一个答案,因此对于正在寻找解决方案的其他人来说更容易。

+0

完美的解决方案,无需代码,只需指向正确的方向:) – 2016-04-11 07:08:24

2

PowerShell Community Extensions有一个Convert-Xml,它将对XML进行XSL转换。如果生成的文件不是有效的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 
}