Передача свойств SoapUI и форматирование чисел xpath/xquery

У меня есть эта передача свойств в SoapUI:

declare namespace soapEnv="http://schemas.xmlsoap.org/soap/envelope/";
//soapEnv:Body/LoginResponse/baseSequenceId

и допустим, он возвращает 123456. Но я хочу 123457 (что я получаю +1)

Я пробовал это:

declare namespace soapEnv="http://schemas.xmlsoap.org/soap/envelope/";
//soapEnv:Body/LoginResponse/baseSequenceId + 1

но в результате я получаю 123457.0. Я попробовал несколько найденных методов переформатирования, но, скорее всего, я использовал их неправильно. Я совсем новичок в этом деле.

Я также пробовал это (с xquery):

declare namespace soapEnv="http://schemas.xmlsoap.org/soap/envelope/";
let $x := //soapEnv:Body/LoginResponse/baseSequenceId
return $x

и пробовал несколько вещей с $x, но все, что я пробовал, заканчивалось нулевым значением или исключением InvocationTargetException.

Любая помощь приветствуется!


person Stefanos Kalantzis    schedule 15.06.2011    source источник
comment
Ну, я не знаю, какую версию xpath использует SoapUI. Я пытался найти ее, но без особого успеха:/   -  person Stefanos Kalantzis    schedule 15.06.2011


Ответы (2)


Большое спасибо за ваши предложения, хотя я не мог заставить их работать :(
Возможно, что-то не так с моим SoapUI, потому что все функции xpath возвращают null..

Я заставил это работать с groovy:

groovyUtils = new com.eviware.soapui.support.GroovyUtils( context )

loginResponse = groovyUtils.getXmlHolder("Login#Response")
loginResponse.declareNamespace( "soapEnv", "http://schemas.xmlsoap.org/soap/envelope/" )
sessionIdStr = loginResponse.getNodeValue( "//soapEnv:Body/LoginResponse/sessionId" )
baseSequenceIdStr = loginResponse.getNodeValue( "//soapEnv:Body/LoginResponse/baseSequenceId" )
sequenceIdStr = (baseSequenceIdStr.toInteger() + 1).toString()

createRequest = groovyUtils.getXmlHolder("Create#Request")
createRequest.declareNamespace( "soapEnv", "http://schemas.xmlsoap.org/soap/envelope/" )
createRequest.setNodeValue( "//soapEnv:Header/SessionId", sessionIdStr )
createRequest.setNodeValue( "//soapEnv:Header/TransactionId", baseSequenceIdStr )
createRequest.setNodeValue( "//soapEnv:Header/SequenceId", sequenceIdStr )
createRequest.updateProperty()
person Stefanos Kalantzis    schedule 16.06.2011

Обратите внимание, что если значение //soapEnv:Body/LoginResponse/baseSequenceId + 1 является целым числом, XPath не должен ставить десятичную точку при преобразовании в строку.

Но, возможно, в этом случае XPath возвращает число, а SoapUI преобразует его в строку и использует десятичную точку.

Я бы сначала попробовал (обновлено):

string(//soapEnv:Body/LoginResponse/baseSequenceId + 1)

Это делается для того, чтобы преобразование в строку происходило внутри XPath, чтобы у SoapUI не было возможности сделать что-то смешное с числовым значением.

В качестве альтернативы вы можете попробовать

floor(//soapEnv:Body/LoginResponse/baseSequenceId + 1)

или даже

string(floor(...))

Если это не сработает, вы можете попробовать

substring-before(//soapEnv:Body/LoginResponse/baseSequenceId + 1, '.')

Это не очень элегантно, но может сработать.

person LarsH    schedule 15.06.2011
comment
Спасибо! Завтра утром попробую первую. Что касается второго, часть XML, которую получает xpath (//soapEnv:Body/...), представляет собой просто целое число (всегда без каких-либо символов). Хотя я не знаю, представлено ли оно как целое число, строка или что-то еще. Тем не менее, «точки» там не будет! - person Stefanos Kalantzis; 15.06.2011
comment
@Стефанос, я понимаю, что значение //soapEnv:Body/LoginResponse/baseSequenceId всегда является целым числом. Однако где-то появляется десятичная точка. Я добавлю еще одно предложение к моему ответу. - person LarsH; 15.06.2011
comment
Если ваши данные нетипизированы (без схемы), то результат добавления будет двойным. XPath отформатирует его как 1234567, но ваш основной язык вполне может отформатировать его с .0 в конце. Так что сделайте преобразование в строку в XPath, используя функцию string(). - person Michael Kay; 16.06.2011