Bash执行XSLT转换时如何将XPATH取值作为输出文件名组成部分
批量XSLT转换带XPATH值文件名实现方案
方案1:PowerShell端预计算XPATH值(适配现有调用逻辑)
你可以在调用Saxon执行转换前,先在PowerShell层加载XML文件计算对应XPATH结果,再拼接为输出文件名,示例代码如下:
# 加载目标XML文件 $xmlContent = [xml](Get-Content $file.FullName -Encoding UTF8) # 替换为你需要的XPATH表达式,示例为统计error节点数量 $xpathResult = $xmlContent.SelectSingleNode("count(//error)").Value # 替换XPATH结果中的非法文件名字符,避免路径报错 $safeResult = $xpathResult -replace '[\\/*?"<>|]', '_' # 拼接完整输出路径 $output = Join-Path $mypath "$safeResult$($file.Name)" # 执行Saxon转换 java -cp $saxonpath net.sf.saxon.Transform -t -s:$file -xsl:$xsltpath -o:$output
方案2:XSLT内部控制输出路径(适用于XPATH值依赖转换过程的场景)
如果需要的XPATH值只能在转换执行过程中获取,可以使用Saxon支持的XSLT 2.0+标准<xsl:result-document>指令,直接在样式表内指定输出文件名:
XSLT样式表示例
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 接收外部传入的基础路径和原文件名 --> <xsl:param name="baseOutputPath" select="'/default/output/'" /> <xsl:param name="sourceFileName" select="'default.xml'" /> <xsl:template match="/"> <!-- 计算需要作为文件名组成部分的XPATH值 --> <xsl:variable name="targetValue" select="count(//error)" /> <!-- 处理非法文件名字符 --> <xsl:variable name="safeFileName" select="replace(concat($targetValue, $sourceFileName), '[\\/*?"<>|]', '_')" /> <!-- 输出到指定路径 --> <xsl:result-document method="xml" href="{$baseOutputPath}{$safeFileName}"> <!-- 此处写入你原有转换逻辑 --> <xsl:apply-templates /> </xsl:result-document> </xsl:template> </xsl:stylesheet>
对应PowerShell调用代码
无需指定-o参数,直接把基础路径和原文件名作为参数传给XSLT即可:
java -cp $saxonpath net.sf.saxon.Transform -t -s:$file -xsl:$xsltpath baseOutputPath="$mypath" sourceFileName="$($file.Name)"
注意事项
- 无论使用哪种方案,都建议对XPATH返回的结果做非法字符替换,避免出现文件名不合法导致的转换失败问题
- 两种方案均支持所有主流Saxon版本(HE/PE/EE),无需额外引入依赖
内容的提问来源于stack exchange,提问作者ffranziiska
相关产品推荐
相关产品推荐

