Я использую XQuery для анализа двух наборов результатов тестов, имеющих одинаковую структуру XML. Функция ниже создает новый набор элементов, которые являются отдельными сравнениями тестовых примеров двух наборов результатов. Для каждого тестового примера должно быть отношение 1-1 для двух наборов, но мой код иногда производит 8 сравнений, и я не могу понять, почему!
Вот мой входной XML, используемый для обоих наборов с разными данными (например, сокращенно):
<tests>
<test-group name="TestA">
<test-case name="CaseA1" success="true"/>
<test-case name="CaseA2" success="false"/>
<test-case name="CaseA3" success="true"/>
</test-group>
<test-group name="TestB">
<test-case name="CaseB1" success="false"/>
<test-case name="CaseB2" success="false"/>
<test-case name="CaseB3" success="true"/>
</test-group>
<test-group name="TestC">
<test-case name="CaseC1" success="false"/>
<test-case name="CaseC2" success="false"/>
<test-case name="CaseC3" success="true"/>
</test-group>
</tests>
Пример вывода:
<test-state delta1="15" delta2="false" isPass="true" fixture="TestA" case="CaseA1"/>
<test-state delta1="12" delta2="true" isPass="false" fixture="TestA" case="CaseA1"/>
<test-state delta1="5" delta2="false" isPass="true" fixture="TestA" case="CaseA1"/>
<test-state delta1="15" delta2="false" isPass="true" fixture="TestC" case="CaseC1"/>
<test-state delta1="12" delta2="true" isPass="false" fixture="TestC" case="CaseC1"/>
<test-state delta1="5" delta2="false" isPass="true" fixture="TestC" case="CaseC1"/>
Вот мой Xquery (например, модифицированный):
declare function app:runReport() {
let $new-run := collection('collection1')
let $old-run := collection('collection2')
return
<report>
{
for $new-case in $new-run//test-case,
$old-case in $old-run//test-case
where $new-case/@name = $old-case/@name and $new-case/../@name = $old-case/../@name
return
let $new-msg := xs:string($new-case/message)
let $old-msg := xs:string($old-case/message)
let $new-len := string-length($new-msg)
let $old-len := string-length($old-msg)
let $msg-dif := $new-len - $old-len
let $delta1 := fn:compare(xs:string($new-case/@success),xs:string($old-case/@success)) = 0
let $delta2 := abs($msg-dif)
return
<test-state
delta1="{$delta1}"
delta2="{$delta2}"
isPass="{$new-case/@success}"
fixture="{$new-case/../@name}"
case="{$new-case/@name}"
path="unknownPath"/>
}
</report>
};
Мне кажется, что он производит перестановки каждой комбинации между $ new-case и $ old-case, но я понятия не имею, почему. Я бы попытался отфильтровать дубликаты, но они не являются точными дубликатами, иногда кажется, что вместо $ new-case используется $ old-case.