簡體   English   中英

使用PowerShell將XML轉換為HTML

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM