0

次のような pmd.xml ファイルがあります。

<file name="file1">
  <violation rule="rulename1" priority="1">
  </violation>
  <violation rule="rulename2" priority="2">
  </violation>
</file>
<file name="file2">
  <violation rule="rulename2" priority="2">
  </violation>
  <violation rule="rulename3" priority="1">
  </violation>
</file>

これを別のxmlファイルに変換するためにxsltファイルを使用しています。

私が今やろうとしているのはこれです: Priority=1 の違反ごとに、xml 全体で同じ名前の違反の数を数えます。後で Prio=2 で同じ。

すべての違反を、それらがドキュメントに表示される頻度とともにリストできるように、おおよそ次のようになります。

prio1:
rulename1, 1
rulename3, 1
prio2:
rulename2, 2

同じ名前の違反をカウントするための適切な XPath 式が見つかりません...

<xsl:for-each select="//violation[@priority = 1]">
<xsl:value-of select="count(???)"/>

誰かが助けになるアイデアを持っていますか?

前もって感謝します!

4

1 に答える 1

1

XSLT 1.0 を想定すると、キーでグループ化できます。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="text"/>

<xsl:key name="k1" match="violation" use="@priority"/>
<xsl:key name="k2" match="violation" use="concat(@priority, '|', @rule)"/>

<xsl:template match="/">
  <xsl:apply-templates select="//violation[generate-id() = generate-id(key('k1', @priority)[1])]"/>
</xsl:template>

<xsl:template match="violation">
  <xsl:value-of select="concat('prio', @priority, ':&#10;')"/>
  <xsl:apply-templates select="key('k1', @priority)[generate-id() = generate-id(key('k2', concat(@priority, '|', @rule))[1])]" mode="rule"/>
</xsl:template>

<xsl:template match="violation" mode="rule">
  <xsl:value-of select="concat(@rule, ', ', count(key('k2', concat(@priority, '|', @rule))), '&#10;')"/>
</xsl:template>

</xsl:stylesheet>

変換

<files>
<file name="file1">
  <violation rule="rulename1" priority="1">
  </violation>
  <violation rule="rulename2" priority="2">
  </violation>
</file>
<file name="file2">
  <violation rule="rulename2" priority="2">
  </violation>
  <violation rule="rulename3" priority="1">
  </violation>
</file>
</files>

の中へ

prio1:
rulename1, 1
rulename3, 1
prio2:
rulename2, 2
于 2013-10-17T16:25:08.407 に答える