ハイフンを含めるには(ディミトレの回答をベースとして使用するので、彼に当然のクレジットを与えてください)、これを行うことができます:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:key name="kElemByName" match="*" use="name()"/>
<xsl:template match=
"*[not(generate-id()=generate-id(key('kElemByName',name())[1]))]">
<xsl:apply-templates select="*" />
</xsl:template>
<xsl:template match="*">
<xsl:apply-templates select="ancestor::*" mode="hyphens" />
<xsl:value-of select=
"concat('<',name(),'> ', count(key('kElemByName',name())),'
')"/>
<xsl:apply-templates select="*"/>
</xsl:template>
<xsl:template match="*" mode="hyphens">
<xsl:text>--</xsl:text>
</xsl:template>
</xsl:stylesheet>
元の入力を使用すると、次が生成されます。
<record> 1
--<fruit> 4
--<vegetable> 2
--<candy> 1
より深くネストされた入力では、
<record>
<fruit>
Apples
</fruit>
<fruit>
<citrus>Grapefruits</citrus>
<citrus>Oranges</citrus>
<citrus>Lemons</citrus>
</fruit>
<fruit>Bananas</fruit>
<fruit>
<pitted>Plums</pitted>
<pitted>Apricots</pitted>
<pitted>Peaches</pitted>
</fruit>
<vegetable>Carrots</vegetable>
<vegetable>Peas</vegetable>
<candy>
<chocolate>Snickers</chocolate>
<chocolate>Milky Way</chocolate>
<chocolate>Hersheys</chocolate>
</candy>
<candy>
<hard>Lozenges</hard>
<hard>Lollipops</hard>
</candy>
</record>
あなたは得る:
<record> 1
--<fruit> 4
----<citrus> 3
----<pitted> 3
--<vegetable> 2
--<candy> 2
----<chocolate> 3
----<hard> 2
どのようだ?