Как отсортировать вывод CppCheck XML для Jenkins?

From: XSLT Sorting - как отсортировать xml дочерние узлы внутри родительского узла с атрибутом

Я использую плагин Jenkins CppCheck, который анализирует файл журнала XML. Однако CppCheck все расставляет как есть и никак не сортируется. Я хочу отсортировать файл журнала XML по тегу location.

tl; dr: иерархия XML - это "результаты / ошибки / ошибка / местоположение", я хочу отсортировать "ошибки" по "местоположению /@ файлу" и "расположению /@ строке"

Я использую это:

@echo off
"C:\Program Files (x86)\xmlstarlet-1.5.0\xml.exe" tr ".\cppcheck_log.xslt" ".\cppcheck_log.xml" 1>".\cppcheck_log_sorted.xml"

Со следующим правилом преобразования XLST:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" omit-xml-declaration="no" indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="errors">
        <xsl:copy>
            <xsl:apply-templates select="@*"/>
            <xsl:apply-templates select="*">
                <xsl:sort select="@file" data-type="text" order="ascending"/>
                <xsl:sort select="@line" data-type="number" order="ascending"/>
            </xsl:apply-templates>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

Но это не работает. Что производит CppCheck:

<?xml version="1.0" encoding="UTF-8"?>
<results version="2">
    <cppcheck version="1.63.1"/>
    <errors>
        <error id="variableScope" severity="style" msg="The scope of the variable &apos;i&apos; can be reduced." verbose="The scope of the variable &apos;i&apos; can be reduced. Warning: Be careful when fixing this message, especially when there are inner loops. Here is an example where cppcheck will write that the scope for &apos;i&apos; can be reduced:
void f(int x)
{
    int i = 0;
    if (x) {
        // it&apos;s safe to move &apos;int i = 0;&apos; here
        for (int n = 0; n &lt; 10; ++n) {
            // it is possible but not safe to move &apos;int i = 0;&apos; here
            do_something(&amp;i);
        }
    }
}
When you see this message it is always safe to reduce the variable scope 1 level.">
            <location file="toto\test.c" line="50"/>
        </error>
        <error id="unreadVariable" severity="style" msg="Variable 'size' is assigned a value that is never used." verbose="Variable 'size' is assigned a value that is never used.">
            <location file="tata\done.c" line="25"/>
        </error>
    </errors>
</results>

Что бы я хотел получить:

<?xml version="1.0" encoding="UTF-8"?>
<results version="2">
    <cppcheck version="1.63.1"/>
    <errors>
        <error id="unreadVariable" severity="style" msg="Variable 'size' is assigned a value that is never used." verbose="Variable 'size' is assigned a value that is never used.">
            <location file="tata\done.c" line="25"/>
        </error>
        <error id="variableScope" severity="style" msg="The scope of the variable &apos;i&apos; can be reduced." verbose="The scope of the variable &apos;i&apos; can be reduced. Warning: Be careful when fixing this message, especially when there are inner loops. Here is an example where cppcheck will write that the scope for &apos;i&apos; can be reduced:
void f(int x)
{
    int i = 0;
    if (x) {
        // it&apos;s safe to move &apos;int i = 0;&apos; here
        for (int n = 0; n &lt; 10; ++n) {
            // it is possible but not safe to move &apos;int i = 0;&apos; here
            do_something(&amp;i);
        }
    }
}
When you see this message it is always safe to reduce the variable scope 1 level.">
            <location file="toto\test.c" line="50"/>
        </error>
    </errors>
</results>

То, что я сейчас получаю, все еще не отсортировано (XMLStarlet выдает мне первое сообщение об ошибке в одну строку):

<?xml version="1.0" encoding="UTF-8"?>
<results version="2">
    <cppcheck version="1.63.1"/>
    <errors>
        <error id="variableScope" severity="style" msg="The scope of the variable 'i' can be reduced." verbose="The scope of the variable 'i' can be reduced. Warning: Be careful when fixing this message, especially when there are inner loops. Here is an example where cppcheck will write that the scope for 'i' can be reduced: void f(int x) {     int i = 0;     if (x) {         // it's safe to move 'int i = 0;' here         for (int n = 0; n &lt; 10; ++n) {             // it is possible but not safe to move 'int i = 0;' here             do_something(&amp;i);         }     } } When you see this message it is always safe to reduce the variable scope 1 level.">
            <location file="toto\test.c" line="50"/>
        </error>
        <error id="unreadVariable" severity="style" msg="Variable 'size' is assigned a value that is never used." verbose="Variable 'size' is assigned a value that is never used.">
            <location file="tata\done.c" line="25"/>
        </error>
    </errors>
</results>

Не хорошо.

Я новичок в преобразовании XML, поэтому любая помощь приветствуется.

Спасибо за ответ...