Reputation: 69
The XSL file groups the report by alert, using that as a unique identifier. However, it should be grouping by site name + alert. Site has a name attribute:
<site name="http://192.168.56.110" host="192.168.56.110" port="80" ssl="false">
This is because it is possible for multiple sites to have the same alert. But this alert would show up only under one site. Any suggestions on how to modify the code, so that alerts are grouped by alert AND site?
Currently XSL looks like this:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes" />
<xsl:template match="/Report">
<Report><xsl:copy-of select="@*" />
<reportname>
<xsl:value-of select="reportname"/>
</reportname>
<reportdesc>
<xsl:value-of select="reportdesc"/>
</reportdesc>
<xsl:for-each select="site">
<site><xsl:copy-of select="@*" />
<alerts>
<xsl:key name="alertByAlert" match="alertitem" use="concat(alert)" />
<xsl:for-each select="alerts/alertitem[generate-id() = generate-id(key('alertByAlert',alert))]">
<alertitem>
<alert>
<xsl:value-of select="alert"/>
</alert>
<riskcode>
<xsl:value-of select="riskcode"/>
</riskcode>
<riskdesc>
<xsl:value-of select="riskdesc"/>
</riskdesc>
<xsl:for-each select="key('alertByAlert', alert)">
<uri>
<xsl:value-of select="uri"/>
</uri>
<param>
<xsl:value-of select="param"/>
</param>
<attack>
<xsl:value-of select="attack"/>
</attack>
</xsl:for-each>
</alertitem>
</xsl:for-each>
</alerts>
</site>
</xsl:for-each >
</Report>
</xsl:template>
</xsl:stylesheet>
Upvotes: 0
Views: 137
Reputation: 167726
Change your key to
<xsl:key name="k1" match="alertitem" use="concat(ancestor::site/@name, '|', alert)" />
(and put it as a child of your xsl:stylesheet
, it is not allowed elsewhere).
Then you can use that key in
<xsl:for-each select="alerts/alertitem[generate-id() = generate-id(key('k1', concat(ancestor::site/@name, '|', alert))[1])]">
Upvotes: 1