Как отсортировать вывод 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 '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 < 10; ++n) {
// it is possible but not safe to move 'int i = 0;' here
do_something(&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 '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 < 10; ++n) {
// it is possible but not safe to move 'int i = 0;' here
do_something(&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 < 10; ++n) { // it is possible but not safe to move 'int i = 0;' here do_something(&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, поэтому любая помощь приветствуется.
Спасибо за ответ...
1 ответ
Используйте один из следующих вариантов:
- средство отслеживания проблем Jenkins для отправки запроса на эту функциональность
- Добавьте свой собственный XSL в плагин xUnit через графический интерфейс Jenkins
Рекомендации
- Сортировать XML по именам атрибутов, используя XSLT
- XUnitConversionService.java
- Настройка плагинов Jenkins xUnit
- Jenkins: xUnit, предоставить пользователю.xsl
- Хадсон: xUnit, предоставить User.xml
- Дженкинс: проверьте, что XSLT недостаточно хорош
- нужна помощь с XSL для пользовательских отчетов с использованием плагина xUnit
- xunit - Пользовательский инструмент - Пользовательская таблица стилей - Указанное глобальное свойство не разрешается
- Информация для разработчиков cppCheck