XSLT 2:如何将输入流作为参数传递给XSL样式表(Saxon HE 10)
Saxon HE 10 传入输入流作为XSL样式表参数的实现方案
- 你无法直接将原始
InputStream传入setStylesheetParameters方法,需要先将输入流解析为XdmValue的子类实例,最常用的是对应XML文档的XdmNode类型。 - 第一步:使用Saxon的
DocumentBuilder解析输入流为XdmNode,示例代码如下:
// 复用你初始化Xslt30Transformer时创建的Processor实例即可 Processor processor = new Processor(false); DocumentBuilder docBuilder = processor.newDocumentBuilder(); // 替换为你自己的输入流实例 InputStream targetInputStream = ...; XdmNode xmlDocNode = docBuilder.build(new StreamSource(targetInputStream));
- 第二步:将解析得到的
XdmNode作为参数传入转换器:
Map<QName, XdmValue> paramMap = new HashMap<>(); // QName的参数名需要和XSL中定义的param名称完全一致 paramMap.put(new QName("test"), xmlDocNode); xslt30Transformer.setStylesheetParameters(paramMap);
- 第三步:调整XSL样式表中的参数定义,匹配传入的节点类型:
<!-- 删除原有默认的字符串取值,声明参数为XML文档节点类型 --> <xsl:param name="test" as="document-node()"/>
如果你需要传入的是非XML格式的二进制流,可以将流内容编码为base64字符串后封装为
XdmAtomicValue传入,XSL中对应声明参数类型为xs:base64Binary即可。
内容的提问来源于stack exchange,提问作者amuru
相关产品推荐
相关产品推荐

