使用PowerShell将XSL应用于XML:调用“Transform”的异常

时间:2016-05-04 10:05:48

标签: xml powershell xslt

我正在尝试使用XSL转换来清理XML文件。当我将我的XSL直接应用于我的XML文件时,它工作正常。但现在我想清理目录中的每个XML文件。我试图创建一个PowerShell脚本,以加载和转换XML文件。

这是我的代码:

$dir = "C:\MyDirectory"
$XSLFileName = "XSLTFile.xsl"
$XSLFileInput = $dir + $XSLFileName

$XMLFileName = "Input.xml"
$XMLInputFile = $dir + $XMLFileName
$OutPutFileName = "Output.xml"
$XMLOutputFile = $dir + $OutPutFileName

cd $dir 

$XSLInputElement = New-Object System.Xml.Xsl.XslCompiledTransform;
$XSLInputElement.Load($XSLFileInput)

$XMLInputDoc = Get-Content -Path $XMLInputFile

$reader = [System.Xml.XmlReader]::Create($XMLInputFile)
$writter = [System.Xml.XmlTextWriter]::Create($XMLOutputFile)

$XSLInputElement.Transform($XMLInputDoc, $writter)

我一直在扔一些文档和SO主题以找到如何使用Transform()方法,但我还没有找到如何处理这个错误:

Exception calling "Transform" with "2" argument(s): "Caractères non conformes dans le chemin d'accès."
At C:\ScirptsDirs\StackOverFlowTransformExample.ps1:20 char:1
+ $XSLInputElement.Transform($XMLInputDoc, $writter)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : ArgumentException
  

注:“Caractèresinconformes dans le chemin d'accès。”意思是:   在访问路径中找到无效符号。

我想要做的是清理我的XML文件,并创建一个其他XML文件,但应用了XSL转换。

编辑:我也尝试过这种方式,正如马丁所说:

$XSLInputElement.Transform($XMLInputFile, $XMLOutputFile)

但是这一次,我有以下错误:

Exception calling "Transform" with "2" argument(s): "Execution of the 'document()' function was prohibited. Use the XsltSettings.EnableDocumentFunction property to enable it. An error occurred at  D:\MyDirectory\XSLTFile.xsl(220,3)."
At C:\ScirptsDirs\StackOverFlowTransformExample.ps1:20 char:1
+ $XSLInputElement.Transform($XMLInputFile, $XMLOutputFile)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : XslTransformException

2 个答案:

答案 0 :(得分:3)

这对我有用。额外的行用于在xsl中启用脚本。

EDIT。似乎上面的解决方案是需要一行来启用文档功能。与我启用脚本的方式类似。

$xslt_settings.EnableDocumentFunction = 1;

可以添加到我的功能

function TransformXML{
    param ($xml, $xsl, $output)

    if (-not $xml -or -not $xsl -or -not $output)
    {
        Write-Host "& .\xslt.ps1 [-xml] xml-input [-xsl] xsl-input [-output] transform-output"
        return 0;
    }

    Try
    {
        $xslt_settings = New-Object System.Xml.Xsl.XsltSettings;
        $XmlUrlResolver = New-Object System.Xml.XmlUrlResolver;
        $xslt_settings.EnableScript = 1;

        $xslt = New-Object System.Xml.Xsl.XslCompiledTransform;
        $xslt.Load($xsl,$xslt_settings,$XmlUrlResolver);
        $xslt.Transform($xml, $output);

    }

    Catch
    {
        $ErrorMessage = $_.Exception.Message
        $FailedItem = $_.Exception.ItemName
        Write-Host  'Error'$ErrorMessage':'$FailedItem':' $_.Exception;
        return 0
    }
    return 1

}

答案 1 :(得分:2)

如果您将输入和输出文件名分别作为字符串路径,则只需使用$XSLInputElement.Transform($XMLInputFile, $XMLOutputFile)