Saxon s9api中如何将节点作为参数设置到转换中并在转换内访问
Saxon s9api中如何将节点作为参数设置到转换中并在转换内访问
我来帮你搞定这个在Saxon s9api里传递节点参数的问题~你现在遇到的情况是只能用原子值(比如QName TEST XdmAtomicValue 24)作为参数,但想要传递像<TempNode><local>Value1</local></TempNode>这样的结构化节点,其实核心就是要先创建出对应的XdmNode实例,再用setParameter传递,下面给你一步步讲具体操作:
第一步:创建XdmNode实例
你可以通过Saxon的DocumentBuilder来构建目标节点,有两种常用方式:
方式1:从XML字符串直接解析
这种方式简单直接,适合你已经明确节点内容的情况:
// 先初始化Saxon Processor Processor processor = new Processor(false); DocumentBuilder docBuilder = processor.newDocumentBuilder(); // 定义你要传递的节点XML字符串 String tempNodeXml = "<TempNode><local>Value1</local></TempNode>"; // 解析成XdmNode XdmNode tempNode = docBuilder.build(new StringReader(tempNodeXml));
方式2:手动构建节点(适合动态生成内容的场景)
如果需要动态生成节点内容,可以用Saxon的XPath构造API:
Processor processor = new Processor(false); DocumentBuilder docBuilder = processor.newDocumentBuilder(); // 创建一个空的文档节点作为上下文 XdmNode emptyDoc = docBuilder.build(new ByteArrayInputStream("<root/>".getBytes())); // 获取XPathCompiler来构造节点 XPathCompiler xpathCompiler = processor.newXPathCompiler(); // 用XPath表达式生成目标节点 XdmNode tempNode = (XdmNode) xpathCompiler.evaluate( "element(TempNode, element(local, 'Value1'))", emptyDoc, XPathResult.SINGLE_NODE );
第二步:将XdmNode设置为转换参数
拿到XdmNode后,直接用XsltTransformer的setParameter方法传递即可,注意参数名要用QName指定:
// 假设你已经初始化好了XsltTransformer实例 XsltTransformer transformer = ...; // 定义参数名称(如果涉及命名空间,要传入对应的命名空间URI) QName paramName = new QName("TempParam"); // 设置参数,直接传入XdmNode transformer.setParameter(paramName, tempNode);
第三步:在XSLT转换中访问节点参数
在你的XSLT文件里,需要先声明对应的参数并指定节点类型,之后就可以像操作普通XML节点一样使用它了:
<!-- 声明参数,指定类型为element(TempNode) --> <xsl:param name="TempParam" as="element(TempNode)"/> <!-- 访问节点内容,比如取出local子节点的值 --> <xsl:value-of select="$TempParam/local"/>
补充说明
你之前尝试过XdmItem,其实XdmNode是XdmItem的子类,而setParameter的第二个参数接受XdmValue类型(XdmItem也是XdmValue的子类),所以只要能正确创建出XdmNode,就可以直接传递啦。
备注:内容来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

