在通过PowerShell运行时,我无法找到捕获.NET Saxon XSLT转换器的<xsl:message/>
输出的方法。
我尝试了各种捕获输出的PowerShell方法,以及各种方法告诉Saxon输出数据但没有成功。我需要使用Saxon XSLT库,因为我们公司致力于它。
尝试
Transformer.MessageListener
。问题:PowerShell不支持创建捕获MessageListener.Message
事件的接口
Transformer.TraceFunctionDestination
。问题:无法使用构造函数实例化StandardLogger
。
$outLogger = New-Object Saxon.Api.StandardLogger -ArgumentList $outLogger
$outLogger.UnderylingTextWriter = $outLogFile
$saxTransform.TraceFunctionDestination = $outLogger
各种PowerShell输出重定向方法。我不认为撒克逊会对此表现不错。
$out = $saxTransform.Run($outSerializer) *> "c:\eric\log.txt"
Write-Output "nada-> $out"
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()
答案 0 :(得分:0)
我们对您的要求表示同情。但是使用XslTransformer.MessageListener是拦截xsl:message输出发送位置的唯一原因。设置TraceFunctionDestination将不会捕获xsl:message输出。
我不是Powershell的专家,但作为一种解决方法,我认为您可以在C#类中编写IMessageListener的实现,并将其构建为在Powershell中使用的程序集。