我正在尝试使用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
答案 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)
。