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>

対応する値 (2、7、10 など) を持つノードのグループごとに、前の例last()の最初のノードに対して、各グループのノードが選択されます。[1]

これが役立つことを願っています。

于 2012-01-16T21:24:38.423 に答える