Поиск худших файлов в отчете stylecop (XSL) - PullRequest
2 голосов
/ 11 января 2010

Я новичок с XSL . Я хотел бы взять отчет StyleCop и отобразить имена файлов и количество их нарушений в порядке убывания (в XSL 1).

Отчет StyleCop выглядит следующим образом:

<StyleCopViolations>
  <Violation Section="A" LineNumber="5" Source="A1  RuleNamespace="Microsoft.StyleCop.CSharp.DocumentationRules" Rule="ElementsMustBeDocumented" RuleId="SA1600">The class must have a documentation header.</Violation>
  <Violation Section="B" LineNumber="8" Source="B1" RuleNamspace="Microsoft.StyleCop.CSharp.DocumentationRules" Rule="ElementsMustBeDocumented" RuleId="SA1600">The method must have a documentation header.</Violation>
  <Violation Section="C" LineNumber="20" Source="C1" RuleNamespace="Microsoft.StyleCop.CSharp.DocumentationRules" Rule="ElementsMustBeDocumented" RuleId="SA1600">The method must have a documentation header.</Violation>
  <Violation Section="D" LineNumber="25" Source="D1" RuleNamespace="Microsoft.StyleCop.CSharp.DocumentationRules" Rule="ElementsMustBeDocumented" RuleId="SA1600">The method must have a documentation header.</Violation>
</StyleCopViolations>

Первая часть моего XSL просто состоит в поиске различных источников, которые нарушают любое правило StyleCop. Таким образом, я группирую элементы «Нарушение» в соответствии со свойством «Источник». Для этого я использую метод Мюнхена.

<xsl:key name="sameFile" match="//StyleCopViolations/Violation" use="@Source"/>
    <xsl:template match="/">

    <xsl:variable name="report.root" select="//StyleCopViolations" />
    <xsl:variable name="report.rootTransformed" select="msxsl:node-set($report.root)" />

...
<xsl:variable name="files">
   <xsl:apply-templates select="$report.root/Violation[count(. | key('sameFile', @Source)[1]) = 1]" mode="compute">
       <xsl:with-param name="violations" select="$report.rootTransformed"/>
   </xsl:apply-templates>
</xsl:variable>

Шаблон, используемый для вычисления количества нарушений, также довольно прост: я копирую атрибут источника и вычисляю запрашиваемое значение.

<xsl:template match="Violation" mode="compute">   
    <xsl:param name="violations"/>    
    <xsl:variable name="Source" select="@Source" />   
    <xsl:copy>   
       <xsl:copy-of select="@Source" />   
       <xsl:element name="NbErrors">
         <xsl:value-of select="count($violations/Violation[@Source=$Source])"/>
 </xsl:element>
    </xsl:copy>  
</xsl:template>

Эта часть отлично работает.

Затем, чтобы отобразить результат в порядке убывания, я использую стандартный тег сортировки:

<xsl:apply-templates select="msxsl:node-set($files)" mode="display">
  <xsl:sort select="NbErrors" data-type="number" order="descending"/>  
</xsl:apply-templates>

Шаблон 'display':

<xsl:template match="Violation" mode="display">
  <tr>
   <td>
     <xsl:value-of select="@Source"/>
   </td>
   <td>
     <xsl:value-of select="NbErrors"/>
   </td>    
 </tr>
 </xsl:template>

Однако файлы не сортируются. В чем может быть проблема?

1 Ответ

0 голосов
/ 12 января 2010

Я нашел решение: использовать for-each вместо apply-template для отображения элементов:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...