суббота, 28 апреля 2018 г.

Contains строки в XSLT

В нашей системе есть SOAP-методы и есть автотесты на них. В автотестах применяются файлики transform.xslt — чтобы можно было переформатировать ожидаемый результат и проверять только те поля, которые нужны нам в данном тесте.

См также:
Folks — open-source проект с API-тестами на Java → там есть пример автотеста на SOAP с transform.xslt
Эволюция нашего использования XSLT в SOAP-тестах → подробнее про наши тесты


Формат записи у нас примерно такой. Вначале идет перечисление полей, которые я хочу увидеть в ответе

<xsl:variable name="fieldsToCopy">
        |surname|name|patronymic|fullNameRawSource|fullNameQC|
        fioTrusted|birthdateTrusted|innTrusted|snilsTrusted|
        </xsl:variable>

А потом мы указываем, что нам нужны все поля переменной fieldsToCopy через contains

<xsl:apply-templates select="cdi:field[contains($fieldsToCopy, @name)]">
      <xsl:sort select="@name"/>
 </xsl:apply-templates>

Так вот, запускаю я тест, он падает, ожидаемый ответ не совпадает с моим. Смотрю, почему — в actual_transformed_response.xml вижу дополнительные поля: inn и snils


Сижу, пытаюсь вкурить, откуда они взялись. В перечислении полей их нет... Может, я неправильно добавила сам XSLT в тест? Может, берется из директории выше? Смотрю туда, хм, нет, там вообще другие поля..

Потупила, пошла к разработчику. Вместе выяснили, что условие contains работает как вхождение названия поля в перечисленное мной. Я сказала, что хочу видеть innTrusted, а в итоге получила два поля: inn и innTrusted, так как inn входит в строку innTrusted

Чего только не узнаешь, в общем ツ
Обошли эту проблему такой конструкцией:


<!-- А вот из полей нам все неинтересны. Конкат нужен, чтобы не попали лишние поля, inn входит в innTrusted -->

<xsl:apply-templates select="cdi:field[contains($fieldsToCopy, concat(@name, '|'))]">
     <xsl:sort select="@name"/>
</xsl:apply-templates>

Комментариев нет:

Отправить комментарий