我认为我能够解决的每个新问题,事实证明我不能。 因此,使用以下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分组完成(因为它似乎总是如此)。我只是看不到它。
谢谢!
答案 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]
节点。
我希望这会有所帮助。