3

答えに基づいて XSLT を使用して、XML ドキュメント内のすべてのユーザーに対して複数の HTML ドキュメントを取得しようとしています: how to apply group by on xslt elements but without success.

XML:

<root>
  <ArrayOfResult>
    <Result>
      <Men>
        <BowlerResult>
          <Person>
            <Name>name 1</Name>
          </Person>
          <Data>
            <Score1>1</Score1>
            <Score2>1</Score2>
            <Score3>1</Score3>
          </Data>
        </BowlerResult>
        <BowlerResult>
          <Person>
            <Name>name 2</Name>
          </Person>
          <Data>
            <Score1>2</Score1>
            <Score2>2</Score2>
            <Score3>2</Score3>
          </Data>
        </BowlerResult>
      </Men>
      <Women>
        <BowlerResult>
          <Person>
            <Name>name 3</Name>
          </Person>
          <Data>
            <Score1>3</Score1>
            <Score2>3</Score2>
            <Score3>3</Score3>
          </Data>
        </BowlerResult>
      </Women>
    </Result>
    <Result>...</Result>
  </ArrayOfResult>
  <ArrayOfResult>...</ArrayOfResult>

人はより多くのリーグに参加できます

私が達成したいこと:すべての人(人/名前で異なる)について、すべての「BowlerResult」要素からデータを蓄積したい

私が今持っているXSLT:

<xsl:key name="keyPerson" match="BowlerResult" use="Person/Name" />

<xsl:template match="text()" />

<xsl:template match="/root">
  <root>
    <xsl:apply-templates />
  </root>
</xsl:template>

<xsl:template
 match="BowlerResult[generate-id(.)=generate-id(key('keyPerson',Person/Name)[1])]">
  <Person value="{Person/Name}">
    <xsl:for-each select="key('keyPerson', Person/Name)">
      <Result>
        <id>
          <xsl:value-of select="Person/Name" />
        </id>
      </Result>
    </xsl:for-each>
  </Person>
</xsl:template>

しかし、これは私に最初の人物の反復を与えるだけです。

4

1 に答える 1

4

XSLT には多くの問題がありますが、ここでの主な問題は、最初のテンプレートのパスが何にも一致しないことでした (TeamResult はルートの直下になく、Result 要素はありません。また、キーの名前は「keyPerson」です。 「keyBowler」ではありません。

この XSLT は、プレーヤーごとに 1 回、プレーヤーを正常にグループ化します。試してみませんか?(注: 実際の入力 XML は、BowlerResult および Bowler という要素名を使用します)

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

  <xsl:key name="keyPerson" match="BowlerResult" use="Bowler/Name" />

  <xsl:template match="text()" />

  <xsl:template match="/root">
    <root>
      <xsl:apply-templates />
    </root>
  </xsl:template>

  <xsl:template
   match="BowlerResult[generate-id(.)=generate-id(key('keyPerson',Bowler/Name)[1])]">
    <xsl:variable name="name" select="Bowler/Name" />
    <Person value="{$name}">
      <xsl:for-each select="key('keyPerson', $name)">
        <Result>
          <id>
            <xsl:value-of select="$name" />
          </id>
        </Result>
      </xsl:for-each>
    </Person>
  </xsl:template>


</xsl:stylesheet>
于 2013-01-18T11:27:54.343 に答える