You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell中使用参数实现XML(XSLT)转换报错及XSL适配问题

解决PowerShell中XSLT多语言文本文件参数传递问题

我在PowerShell中使用XSLT进行XML转换,涉及两个XML文件:一个存储结构,另一个存储多语言文本。单语言场景下,结构文件直接作为Transform方法的参数,文本文件是XSL里的硬编码变量,运行正常。但添加多语言后,硬编码路径无法适配不同语言文件,因此需要调整XSL文件和PowerShell转换逻辑,将多语言文本文件以参数形式传递。已知可以用System.Xml.Xsl.XsltArgumentList实现,但调用Transform方法传三个参数时出现重载错误:Cannot find an overload for "Transform" and the argument count: "3",同时不清楚如何修改XSL文件用参数替代变量。


一、修正PowerShell的Transform方法调用问题

错误原因是直接传递字符串路径时,没有匹配的三参数重载。Transform的三参数重载要求输入为XmlReader、参数列表为XsltArgumentList、输出为XmlWriter,而非直接传文件路径字符串。修改后的代码如下:

$XsltSettings.EnableDocumentFunction = 1

$argList = New-Object System.Xml.Xsl.XsltArgumentList

$Xslt = New-Object System.Xml.Xsl.XslCompiledTransform
$PathToXsltFile = "$pwd\xsl\lookup_texts.xsl"
$Xslt.Load($PathToXsltFile, $XsltSettings, (New-Object System.Xml.XmlUrlResolver))

$PathOfXMLRulesTextsFile = Join-Path -Path $langdestination -ChildPath ('{0}{1}' -f $topic.name, 'Texts.xml')
Write-Host $PathOfXMLRulesTextsFile

# 参数名和XSL中的param保持一致
$argList.AddParam("textFile", "", $topicTextsOutputFile)

# 用XmlReader和XmlWriter包装输入输出文件,匹配重载要求
$readerSettings = New-Object System.Xml.XmlReaderSettings
$reader = [System.Xml.XmlReader]::Create($topicRulesFile, $readerSettings)
$writerSettings = $Xslt.OutputSettings.Clone()
$writer = [System.Xml.XmlWriter]::Create($PathOfXMLRulesTextsFile, $writerSettings)

try {
    $Xslt.Transform($reader, $argList, $writer)
}
finally {
    # 确保资源释放
    $reader.Close()
    $writer.Close()
}

二、修正XSLT文件的参数定义与引用

原XSL中参数定义带input:前缀,和PowerShell传递的参数名不匹配,导致无法正确引用。修改后的XSL片段如下:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:zzz="urn:cfgtext" exclude-result-prefixes="zzz">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<!-- 定义参数名,和PowerShell中AddParam的名称完全一致 -->
<xsl:param name="textFile" />
<!-- 注释掉原硬编码变量 -->
<!-- <xsl:variable name="textFile" select="'C:\Rules\CFG_Texts.xml'"/> -->

<xsl:template match="@*|node()">
  <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="@resourceID">
    <xsl:variable name="messageNumber" select="."/>
    <xsl:attribute name="resourceID">
        <xsl:value-of select="."/>
    </xsl:attribute>
    <xsl:attribute name="resourceText">
        <!-- 直接引用定义好的参数$textFile -->
        <xsl:value-of select="document($textFile)/zzz:Resources/zzz:Text[@resourceID=$messageNumber]/node()"/>
    </xsl:attribute>
    <xsl:apply-templates select="node()|@*"/>
</xsl:template>

</xsl:stylesheet>

关键修正点:

  1. 移除xsl:param的input:前缀,确保参数名和PowerShell传递的textFile完全一致
  2. 确保document()函数中引用的是正确的参数$textFile

内容的提问来源于stack exchange,提问作者Gunilla

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 04:45:15