如何使用PowerShell中的Saxon XSLT转换器捕获xsl:message输出

时间:2015-03-05 18:21:35

标签: powershell xslt saxon

在通过PowerShell运行时,我无法找到捕获.NET Saxon XSLT转换器的<xsl:message/>输出的方法。

我尝试了各种捕获输出的PowerShell方法,以及各种方法告诉Saxon输出数据但没有成功。我需要使用Saxon XSLT库,因为我们公司致力于它。

尝试

  1. Transformer.MessageListener。问题:PowerShell不支持创建捕获MessageListener.Message事件的接口

  2. Transformer.TraceFunctionDestination。问题:无法使用构造函数实例化StandardLogger

    $outLogger = New-Object Saxon.Api.StandardLogger -ArgumentList $outLogger
    $outLogger.UnderylingTextWriter = $outLogFile
    $saxTransform.TraceFunctionDestination = $outLogger
    
  3. 各种PowerShell输出重定向方法。我不认为撒克逊会对此表现不错。

    $out = $saxTransform.Run($outSerializer) *> "c:\eric\log.txt"
    Write-Output "nada-> $out"
    
  4. XSLT:

    <xsl:template match="/">
      <xsl:message>I want to see this in a file</xsl:message>
    </xsl:template>
    

    的PowerShell:

    # Instantiate an Xslt transformer
    $saxonPath = GetSaxonDllPath
    
    Add-Type -Path $saxonPath
    $saxProcessor = New-Object Saxon.Api.Processor
    $saxCompiler = $saxProcessor.NewXsltCompiler()
    
    $baseXsltPath = [System.IO.Path]::GetDirectoryName($inXsltPath)
    $uri = [System.Uri]$baseXsltPath
    $saxCompiler.BaseUri = $uri
    
    Write-Output "Compiling..."
    $uri = [System.Uri]$inXsltPath
    $saxExecutable = $saxCompiler.Compile($uri)
    $saxTransform = $saxExecutable.Load()
    
    #Prepare the input XML file
    $basePath = [System.IO.Path]::GetDirectoryName($inXmlFilePath)
    $uri = [System.Uri]$basePath
    $inFileStream = [System.IO.File]::OpenRead($inXmlFilePath)
    $saxTransform.SetInputStream($inFileStream, $uri);
    
    ##Set XSLT processing parameters
    if ($arguments) {
    foreach($argument in $arguments.GetEnumerator()) {
      $paramName = New-Object Saxon.Api.QName($argument.Name)
      $paramValue = New-Object Saxon.Api.XdmAtomicValue($argument.Value)
      $saxTransform.SetParameter($paramName, $paramValue)
    }
    }
    
    #Prepare the output file
    $outFileStream = [System.IO.File]::OpenWrite($outFileName)
    $outSerializer = New-Object Saxon.Api.Serializer
    $outSerializer.SetOutputStream($outFileStream);
    
    $outLogFile = [System.IO.File]::OpenWrite("c:\eric\log.txt")
    $outLogger = New-Object Saxon.Api.StandardLogger($outLogFile)
    
    #Transform
    Write-Output "Transforming..."
    $saxTransform.Run($outSerializer)
    
    Write-Output "Transformation done."
    $outLogFile.Close()
    $outLogFile.Dispose()
    
    #Cleanup
    $inFileStream.Close()
    $inFileStream.Dispose()
    
    $outFileStream.Close()
    $outFileStream.Dispose()
    

1 个答案:

答案 0 :(得分:0)

我们对您的要求表示同情。但是使用XslTransformer.MessageListener是拦截xsl:message输出发送位置的唯一原因。设置TraceFunctionDestination将不会捕获xsl:message输出。

我不是Powershell的专家,但作为一种解决方法,我认为您可以在C#类中编写IMessageListener的实现,并将其构建为在Powershell中使用的程序集。