Общее решение для ввода, содержащее узлы с любыми именами, может быть выполнено с использованием метода Muenchian :
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:key name="nodes-by-name" match="*" use="name()"/>
<xsl:template match="/">
<output>
<xsl:for-each select="//*[count(.|key('nodes-by-name', name())[1]) = 1]">
<node name="{name()}" count="{count(key('nodes-by-name', name()))}"/>
</xsl:for-each>
</output>
</xsl:template>
</xsl:stylesheet>
Объяснение: Используя xsl:key
, создайте отображение из имен в узлы, имеющие это имя. Затем выполните итерацию по всем уникальным именам и выведите количество узлов для имени. Основной трюк здесь - как перебирать уникальные имена. См. Связанную страницу для объяснения идиомы count(.|foo)=1
, используемой для выяснения, является ли foo
набором узлов, содержащим только узел контекста.