要包括连字符(我将使用 Dimitre 的答案作为基础,所以请给他应得的信用),你可以这样做:
<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
怎么样?