xslt1.0 (firefox): подсчет узлов с различным значением, muenchian-группировка? - PullRequest
0 голосов
/ 16 января 2012

Каждая новая проблема, которую, я думаю, я смогу решить, оказывается, что я не могу. Итак, с помощью следующего 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>

Полагаю, это можно сделать (как кажется, всегда) с помощью мюньхианской группировки. Я просто не вижу этого.

Спасибо!

1 Ответ

1 голос
/ 17 января 2012

Я тоже новичок в 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] в предыдущем примере.

Надеюсь, это поможет.

...