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
相关产品推荐
相关产品推荐

