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

Saxon(.NET)中如何用SetParameter为XSLT参数设置XPath表达式?

解决方案

针对XSLT 2.0和Saxon 8,没办法直接通过SetParameter方法把XPath表达式传给参数让XSLT自动求值。因为SetParameter接受的是已经计算好的XdmValue(或原子值),不是表达式字符串——你之前传的字符串会被当作字面量,自然没法解析成XPath去取节点值。

给你两个可行的处理方式:

方式一:修改XSLT参数逻辑(推荐)

在样式表里加一个开关参数,控制utcNow的取值逻辑。单元测试时只需要切换开关,不用额外处理XPath:

<!-- 新增开关参数,默认使用当前时间 -->
<xsl:param name="useSourceDateTime" select="false()" as="xs:boolean"/>
<!-- 根据开关决定utcNow的取值来源 -->
<xsl:param name="utcNow" select="if ($useSourceDateTime) then //header/creationdate else current-dateTime()" as="xs:dateTime"/>

然后在.NET代码里只需设置开关参数:

xsltTransformer.SetParameter(new QName("", "useSourceDateTime"), new XdmAtomicValue(true));

方式二:在.NET中预计算XPath结果再传参

如果不想改动XSLT,就只能先在.NET里用Saxon的API解析源文档、执行XPath,拿到结果后再传给参数。虽然你觉得冗余,但这是当前场景下的必要步骤:

// 初始化Saxon处理器
Processor processor = new Processor();
// 加载源文档
XdmNode sourceDoc = processor.NewDocumentBuilder().Build(new Uri("你的源文档路径"));
// 编译并执行目标XPath表达式
XPathCompiler xpathCompiler = processor.NewXPathCompiler();
XPathSelector selector = xpathCompiler.Compile("//header/creationdate").Load();
selector.ContextItem = sourceDoc;
XdmValue dateValue = selector.Evaluate();
// 将计算结果设置为utcNow参数
xsltTransformer.SetParameter(new QName("", "utcNow"), dateValue);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 01:37:06