0

XSLT を使用して、次の 2 つの XML の最初の XML を 2 番目の XML に変換するにはどうすればよいですか?

最初の XML はブログのコメントを日付別にグループ化するのに対し、2 番目の XML はコメントをユーザー別にグループ化するためです。

入力 XML:

<blog>
    <block>
        <day>2011-11-20</day> 
        <data>
            <comment>bla bla bla</comment>
            <ops>
                <user>357098</user> 
            <ops>
        </data>
    </block>
    <block>
        <day>2011-11-21</day> 
        <data>
            <comment>blu blu blu</comment>
            <ops>
                <user>357098</user> 
            <ops>
        </data>
        <data>
            <comment>bum</comment>
            <ops>
                <user>11111</user> 
            <ops>
        </data>
    </block>
</blog>

そして、これを出力する必要があります:

<blog>
    <user id="357098">
        <list>
            <comment>
                <text>bla bla bla</text>
                <date>2011-11-20</date>
            </comment>
            <comment>
                <text>blu blu blu</text>
                <date>2011-11-21</date>
            </comment>          
        </list>
    </user>
    <user id="11111">
        <list>
            <comment>
                <text>bum</text>
                <date>2011-11-21</date>
            </comment>
        </list>
    </user>
</blog>
4

1 に答える 1

1

これは典型的なグループ化の問題であり、XSLT 1.0 ソリューションは次のとおりです。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
  <xsl:key name="kUser" match="data" use="ops/user" />

  <xsl:template match="/*">
    <xsl:copy>
      <xsl:apply-templates select="block/data[generate-id() = 
                                            generate-id(key('kUser', ops/user)[1])]" />
    </xsl:copy>
  </xsl:template>

  <xsl:template match="data">
    <user id="{ops/user}">
      <list>
        <xsl:apply-templates select="key('kUser', ops/user)/comment" />
      </list>
    </user>
  </xsl:template>

  <xsl:template match="comment">
    <comment>
      <text>
        <xsl:value-of select="." />
      </text>
      <date>
        <xsl:value-of select="../../day" />
      </date>
    </comment>
  </xsl:template>
</xsl:stylesheet>

サンプル入力で実行すると、結果は次のようになります。

<blog>
  <user id="357098">
    <list>
      <comment>
        <text>bla bla bla</text>
        <date>2011-11-20</date>
      </comment>
      <comment>
        <text>blu blu blu</text>
        <date>2011-11-21</date>
      </comment>
    </list>
  </user>
  <user id="11111">
    <list>
      <comment>
        <text>bum</text>
        <date>2011-11-21</date>
      </comment>
    </list>
  </user>
</blog>
于 2013-07-05T11:25:33.180 に答える