xslt 1.0(firefox):计算具有不同值的节点,muenchian-grouping?

时间:2012-01-16 16:17:50

标签: foreach grouping xslt-1.0 muenchian-grouping

我认为我能够解决的每个新问题,事实证明我不能。 因此,使用以下XML,我想知道有多少不同的节点具有不同的@num属性。看看希望的输出可能更容易理解。

初始XML代码

<data>
    <prot seq="AAA">
        <node num="2">1345</node>
        <node num="2">11245</node>
        <node num="2">112w45</node>
        <node num="7">88885</node>
    </prot>
    <prot seq="BBB">
        <node num="2">678</node>
        <node num="2">456</node>
        <node num="7">4w56</node>
        <node num="7">6666</node>
    </prot>
    <prot seq="CCC">
        <node num="2">111</node>
        <node num="2">222</node>
        <node num="2">22w2</node>
        <node num="7">333</node>
        <node num="10">3433</node>
    </prot>
</data>

并希望输出,以便表示有多少不同的“数字”

<root>
<num>2</num>
<num>7</num>
<num>10</num>
</root>

我想可以用muenchian分组完成(因为它似乎总是如此)。我只是看不到它。

谢谢!

1 个答案:

答案 0 :(得分:1)

我也是Meunchian的新手。这是我的解决方案:

<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:output method="xml" indent="yes"/>
  <xsl:key name="dupes" match="node" use="@num"/>
  <xsl:template match="/">
    <root>
      <xsl:apply-templates select="//node[generate-id() =
           generate-id(key('dupes', @num)[1])]"/>
    </root>
  </xsl:template>

  <xsl:template match="node">
    <num val="{.}">
      <xsl:value-of select="@num"/>
    </num>
  </xsl:template>
</xsl:stylesheet>

当我使用xsltproc运行时:

~ zacharyyoung$ xsltproc so.xsl so.xml
<?xml version="1.0"?>
<root>
  <num val="1345">2</num>
  <num val="88885">7</num>
  <num val="3433">10</num>
</root>

我添加了val="{.}"位以显示正在使用密钥分组的节点。如果我们将...key('dupes', @num)[1]...更改为...key('dupes', @num)[last()]...,我们可以在此处看到差异:

<root>
  <num val="22w2">2</num>
  <num val="333">7</num>
  <num val="3433">10</num>
</root>

对于具有相应值(2,7,10等等)的每组节点,选择每个组中的last()节点,而不是前一个示例中的第一个[1]节点。

我希望这会有所帮助。