Это более общее решение, которое перечисляет количество всех различных значений Result
без их жесткого кодирования - например, если документ XML изменяется так, что появляются результаты SKIP или INDECISIVE,эти новые значения также будут перечислены и подсчитаны:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:variable name="vLower" select=
"'abcdefghijklmnopqrstuvwxyz'"/>
<xsl:variable name="vUpper" select=
"'ABCDEFGHIJKLMNOPQRSTUVWXYZ'"/>
<xsl:key name="kResultByVal" match="Result"
use="translate(normalize-space(),
'abcdefghijklmnopqrstuvwxyz',
'ABCDEFGHIJKLMNOPQRSTUVWXYZ')"/>
<xsl:template match="text()"/>
<xsl:template match=
"Result
[generate-id()
=
generate-id(key('kResultByVal',
translate(normalize-space(),
'abcdefghijklmnopqrstuvwxyz',
'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
)
)[1])
]
">
<xsl:text>
</xsl:text>
<xsl:value-of select="translate(normalize-space(),$vLower,$vUpper)"/>
<xsl:text>: </xsl:text>
<xsl:value-of select=
"count(key('kResultByVal',
translate(normalize-space(),
$vLower,
$vUpper
)
)
)
"/>
</xsl:template>
</xsl:stylesheet>
применительно к предоставленному документу XML :
<Tests>
<Test>
<TestName> a </TestName>
<Date> 12.11.10 </Date>
<Result> Pass</Result>
</Test>
<Test>
<TestName> b </TestName>
<Date> 13.11.10 </Date>
<Result> Fail </Result>
</Test>
<Test>
<TestName> c </TestName>
<Date> 14.11.10 </Date>
<Result> Pass </Result>
</Test>
</Tests>
требуемый, правильный результатпроизводится :
PASS: 2
FAIL: 1
II.Решение XSLT 2.0, которое дает тот же результат :
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/">
<xsl:for-each-group select="//Result"
group-by="normalize-space(upper-case(.))">
<xsl:sequence select=
"normalize-space(upper-case(.)),
count(current-group()),
'
'
"/>
</xsl:for-each-group>
</xsl:template>
</xsl:stylesheet>