Spring DSL: использовать заголовок сообщения в преобразователе

У меня есть XML, как показано ниже, во время выполнения я хочу динамически обрабатывать. Первый раз первый, потом и т. Д.

<tag1> 
  <tag2> 
.
.
.
  </tag2>
  <tag2>
.
.
.
  </tag2>
</tag1>

CASE1: рабочий код отправляет статический параметр 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[]{});
}

Выше работает и трансформатор может trasnform 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))));
}

ОШИБКА при преобразовании:

Ошибка в строке 158 test.xslt(до строки 158 работала нормально) XPTY0004: последовательность из более чем одного элемента не допускается в качестве первого аргумента start-with() ("xxmmyty", "xxmmyty")

Мой xslt в строке 158

<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>

В CASE1 с тем же файлом xslt я могу передать приведенный выше код, но в случае динамической передачи (CASE2) это дает сбой.

1 ответ

Прежде всего, похоже, что вы используете достаточно старую версию 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"))))).

То, что вы делаете с лямбдой, нельзя сочетать с трансформатором с этой фабрики.

ОБНОВИТЬ

Вы должны изменить свой xsltParameters() принять String вместо. Который будет просто представление необработанного выражения.

Итак, ваш CASE1 будет выглядеть так:

.transform(Transformers.xslt(this.config.getSome().getXslt(), xsltParameters("'1'")))

Со значением как буквальным выражением.

CASE2 будет выглядеть так:

.transform(Transformers.xslt(this.config.getSome().getXslt(), xsltParameters("headers.int_val")))
Другие вопросы по тегам