Я новичок с 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>
Однако файлы не сортируются. В чем может быть проблема?