0

每个我认为我能够解决的新问题,结果证明我不能。因此,通过以下 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>

以及希望的输出,以便它表达有多少不同的“num”

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

我想它可以通过 muenchian 分组来完成(似乎总是如此)。我只是看不到它。

谢谢!

4

1 回答 1

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>

For every group of nodes with corresponding values (2,7,10, etc...), the last() node in each group is selected, versus the first [1] in the previous example.

I hope this helps.

于 2012-01-16T21:24:38.423 回答