[英]Using PowerShell to convert XML to HTML
我有一个XML文件:
<?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。 我该怎么办呢?
此博客条目有一个应该有效的代码片段。 它使用System.Xml.Xsl.XslCompiledTransform
.NET类来执行XSL转换。 其余的只是用于获取输入和显示输出。
这本来是一个评论,但我想我会把它作为答案,这样对于寻找解决方案的其他人来说更容易。
PowerShell社区扩展有一个Convert-Xml
,它将对XML进行XSL转换。 如果生成的文件不是HTML,那么您需要处理XSL文件。
如果要返回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
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.