3

我是 xsl 的新手。我有以下xml:

    <record>
<fruit>Apples</fruit>
<fruit>Oranges</fruit>
<fruit>Bananas</fruit>
<fruit>Plums</fruit>
<vegetable>Carrots</vegetable>
<vegetable>Peas</vegetable>
<candy>Snickers</candy>

我想使用 key 功能并有一个输出文件:

     <record> 1
--<fruit> 4
--<vegetable> 2
--<candy> 1

有什么解决办法吗?

4

2 回答 2

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
于 2013-01-12T04:11:31.600 回答
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

怎么样?

于 2013-01-12T15:02:25.877 回答