如何通过xslt在xml文件中按名称计算节点?

时间:2013-01-12 03:58:04

标签: xml xslt

我是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

任何解决方案?

2 个答案:

答案 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('&lt;',name(),'> ', count(key('kElemByName',name())),'&#xA;')"/>
  <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('&lt;',name(),'> ', count(key('kElemByName',name())),'&#xA;')"/>
    <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

怎么样?