我是xsl的新手。我在xml以下:
<record>
<fruit>Apples</fruit>
<fruit>Oranges</fruit>
<fruit>Bananas</fruit>
<fruit>Plums</fruit>
<vegetable>Carrots</vegetable>
<vegetable>Peas</vegetable>
<candy>Snickers</candy>
我想使用键功能并有一个输出文件:
<record> 1
--<fruit> 4
--<vegetable> 2
--<candy> 1
任何解决方案?
答案 0 :(得分:2)
这么简单:
<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:template match="*">
<xsl:value-of select=
"concat('<',name(),'> ', count(key('kElemByName',name())),'
')"/>
<xsl:apply-templates select="*"/>
</xsl:template>
</xsl:stylesheet>
在提供的XML文档上应用此转换时:
<record>
<fruit>Apples</fruit>
<fruit>Oranges</fruit>
<fruit>Bananas</fruit>
<fruit>Plums</fruit>
<vegetable>Carrots</vegetable>
<vegetable>Peas</vegetable>
<candy>Snickers</candy>
</record>
产生了想要的正确结果:
<record> 1
<fruit> 4
<vegetable> 2
<candy> 1
答案 1 :(得分:1)
要包含连字符(我将使用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
怎么样?