4

I have an XML file:

<?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>

The xsl file transforms it into HTML. I can't open the file in IE just fine and view the expected results. I would like to via a PowerShell script convert this in plain HTML. How would I go about that?

Justin808
  • 20,859
  • 46
  • 160
  • 265
  • 1
    http://devio.wordpress.com/2009/09/15/command-line-xslt-processor-with-powershell/ – austin Apr 08 '13 at 21:09
  • 1
    With some explanation, the above comment should be an answer; possibly the accepted answer (since it doesn't depend upon loading an extra module). – alroc Apr 09 '13 at 01:58

3 Answers3

5

This blog entry has a code snippet that should work. It uses the System.Xml.Xsl.XslCompiledTransform .NET class to do the XSL transformation. The rest is just for getting the input and displaying the output.

This was originally a comment, but I guess I'll make it an answer so it's easier for other people who are searching for a solution.

austin
  • 5,816
  • 2
  • 32
  • 40
2

The PowerShell Community Extensions has a Convert-Xml that will do an XSL transform on the XML. If the resulting file isn't valid HTML then you need to work on the XSL file.

Keith Hill
  • 194,368
  • 42
  • 353
  • 369
0

If you want to return an xml object instead of writing the output to file so you can do more in-line activities. this will work. in addition i split the creation of the processor into a separate function so that you can create it once and re-use which is more memory friendly.

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
}
Justin
  • 1,303
  • 15
  • 30