我有如下所示的xml,在运行时我要动态处理。首先是第一次,然后是等
<tag1>
<tag2>
.
.
.
</tag2>
<tag2>
.
.
.
</tag2>
</tag1>
案例1:工作代码发送静态xslt参数:
.transform(Transformers.xslt(this.config.getSome().getXslt(), xsltParameters(1 or 2)))
public Tuple2[] xsltParameters(int number)
{
final SpelExpressionParser parser = new SpelExpressionParser();
final List<Tuple2<String,Expression>> parameters = new ArrayList<>();
parameters.add(Tuples.of("Id1", parser.parseRaw(String.format("headers['%s']",ID1))));
parameters.add(Tuples.of("Id2", parser.parseRaw(String.format("headers['%s']",ID2))));
parameters.add(Tuples.of("tagNumber", parser.parseRaw(String.format("%d",number))));
return parameters.toArray(new Tuple2[]{});
}
上面正在工作,变压器可以转换为xslt。
情况2:我想传递动态数字时出错:
.transform(Message.class, m-> Transformers.xslt(this.config.getSome().getXslt(), xsltParameters())
xsltparametr(){
parameters.add(Tuples.of("tagNumber",
parser.parseRaw(String.format("headers['%s']",COUNT))));
}
转换时出错:
test.xslt的158行出现错误(在158行之前工作正常) XPTY0004:不允许将一个以上项目的序列作为starts-with()的第一个参数(“ xxmmyty”,“ xxmmyty”)
我在第158行的xslt
<xsl:if test="starts-with(xc:tag1/xc:tag2[$count]/xc:trade/xcml:header/xcml:Identifier/xcml:tradeId[@IdScheme='urn:abcd.something'], 'XYZ')" >
<xsl:value-of select="tag" />
</xsl:if>
在具有相同xslt文件的CASE1中,我可以传递上面的代码,但是在动态传递(CASE2)的情况下,它会失败。
答案 0 :(得分:0)
首先,看起来您使用的是足够老的Spring版本。
希望至少升级到5.0.x
。
第二,您的xsltParameters()
是什么还不清楚。您对我们隐藏了它,而我们完全不知道您在那做什么。尽管我们可以假定您完全基于此方法:
@SafeVarargs
public static XsltPayloadTransformer xslt(Resource xsltTemplate,
Tuple2<String, Expression>... xslParameterMappings) {
因此,您在xsltParameters()
中构建了Tuple2
的数组。好。因此,可以访问需要构建适当表达式的参数中的标头。
我很确定它可以是FunctionExpression
:
.transform(Transformers.xslt(this.config.getSome().getXslt(),
Tuples.of("foo", new FunctionExpression<Message<?>>(m -> m.getHeader.get("int_val"))))).
您对lambda所做的操作不能与该工厂的变压器一起使用。
更新
您需要修改xsltParameters()
以接受String
。这将只是原始表达表示形式。
因此,您的CASE1将是这样的:
.transform(Transformers.xslt(this.config.getSome().getXslt(), xsltParameters("'1'")))
其含义为文字表达。
CASE2将如下所示:
.transform(Transformers.xslt(this.config.getSome().getXslt(), xsltParameters("headers.int_val")))