0

これは、投稿「xmlを未知数が多すぎるhtmlテーブルに変換する」のパート2です。言語ごとに異なる行を持つhtmlテーブルを作成することに加えて、descripGrpからの情報を含む異なる行が言語ごとに必要になります。これは、言語「CS」の1つのdescripGrpを含む元のXMLファイルからの抜粋です。

<mtf>
  <conceptGrp>
    <concept>1</concept>

    <languageGrp>
      <language lang="DE" type="Deutsch"/>

      <termGrp>
        <term>Abbildung</term>
      </termGrp>
    </languageGrp>

    <languageGrp>
      <language lang="PL" type="Polnisch"/>

      <termGrp>
        <term>ilustracja</term>
      </termGrp>
    </languageGrp>

    <languageGrp>
      <language lang="RU" type="Russisch"/>

      <termGrp>
        <term>иллюстрация</term>
      </termGrp>

      <termGrp>
        <term>рисунок</term>
      </termGrp>
    </languageGrp>

    <languageGrp>
      <language lang="CS" type="Tschechisch"/>

      <termGrp>
        <term>vyobrazení</term>

        <descripGrp>
          <descrip type="Autor">MK</descrip>
        </descripGrp>
      </termGrp>
    </languageGrp>
  </conceptGrp>
</mtf>

「descripGrp」はさまざまな「タイプ」を持つことができ、「languageGrp / termGrP」ごとに存在する場合もあれば、すべて一緒に欠落している場合もあります。最初の問題に優れた答えを提供してくれたJLRisheのおかげで、最初の質問は答えですが、ここで言及されている追加はまだ開いています。ご入力いただきありがとうございます。非常に、非常に感謝しています。

4

1 に答える 1

0

これは私が思いついたものです:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" encoding="utf-8" indent="yes"/>
  <xsl:key name="kLang" match="languageGrp" use="language/@lang" />
  <xsl:key name="kDescrip" match="descrip"
           use="concat(../../../language/@lang, '+', @type)" />
  <xsl:variable name="uniqueLangs"
                select="/mtf/conceptGrp/languageGrp
                  [generate-id() =  generate-id(key('kLang', language/@lang)[1])]" />
  <!-- A set of the first item of each <descrip>, grouped by @lang and @type -->
  <xsl:variable name="uniqueDescrip"
                select="/mtf/conceptGrp/languageGrp/termGrp/descripGrp/descrip
                  [generate-id() = 
                     generate-id(key('kDescrip', 
                        concat(../../../language/@lang, '+', @type))[1])]" />

  <xsl:template match="mtf">
    <html>
      <body>
        <h2>Terminologie</h2>
        <table>
          <tr>
            <!--Zeile 1-->
            <td>Konzept-ID</td>
            <xsl:apply-templates select="$uniqueLangs" mode="header"/>
          </tr>
          <xsl:apply-templates/>
        </table>
      </body>
    </html>
  </xsl:template>


  <xsl:template match="conceptGrp">
    <xsl:apply-templates select="languageGrp" mode="maxGroup">
      <xsl:sort select="count(termGrp)" order="descending" data-type="number"/>
    </xsl:apply-templates>
  </xsl:template>

  <xsl:template match="languageGrp" mode="header">
    <td>
      <xsl:value-of select="language/@type"/>
    </td>
    <xsl:apply-templates
          select="$uniqueDescrip[../../../language/@lang = 
                             current()/language/@lang]"
          mode="header" />
  </xsl:template>

  <xsl:template match="descrip" mode="header">
    <td>
      <xsl:value-of select="@type"/>
    </td>
  </xsl:template>

  <xsl:template match="languageGrp" mode="maxGroup">
    <!-- Only use the first group out of the sorting (most termGrps) -->
    <xsl:if test="position() = 1">
      <xsl:apply-templates select="termGrp" />
    </xsl:if>
  </xsl:template>

  <xsl:template match="termGrp">
    <tr>
      <td>
        <xsl:value-of select="../../concept"/>
      </td>
      <!-- Iterate through all of the distinct languages -->
      <xsl:apply-templates select="$uniqueLangs" mode="item">
        <xsl:with-param name="currConcept" select="../.." />
        <xsl:with-param name="pos" select="position()" />
      </xsl:apply-templates>
    </tr>
  </xsl:template>

  <xsl:template match="languageGrp" mode="item">
    <xsl:param name="currConcept" />
    <xsl:param name="pos" />

    <xsl:variable name="matchingTermGrp"
                  select="$currConcept/languageGrp[language/@lang = 
                                                   current()/language/@lang]
                                                   /termGrp[$pos]" />
    <td>
      <xsl:value-of select="$matchingTermGrp/term"/>
    </td>
    <xsl:apply-templates
      select="$uniqueDescrip[../../../language/@lang = current()/language/@lang]"
      mode="value">
      <xsl:with-param name="termGrp" select="$matchingTermGrp" />
    </xsl:apply-templates>
  </xsl:template>

  <xsl:template match="descrip" mode="value">
    <xsl:param name="termGrp" />
    <td>
      <xsl:value-of select="$termGrp/descripGrp/descrip[@type = current()/@type]" />
    </td>
  </xsl:template>
</xsl:stylesheet>

この入力 XML で実行すると、次のようになります。

<mtf>
  <conceptGrp>
    <concept>1</concept>

    <languageGrp>
      <language lang="DE" type="Deutsch"/>

      <termGrp>
        <term>Abbildung</term>
      </termGrp>
    </languageGrp>

    <languageGrp>
      <language lang="PL" type="Polnisch"/>

      <termGrp>
        <term>ilustracja</term>
      </termGrp>
    </languageGrp>

    <languageGrp>
      <language lang="RU" type="Russisch"/>

      <termGrp>
        <term>иллюстрация</term>
        <descripGrp>
          <descrip type="Other">Sales</descrip>
        </descripGrp>
      </termGrp>

      <termGrp>
        <term>рисунок</term>
        <descripGrp>
          <descrip type="Other">Marketing</descrip>
        </descripGrp>
      </termGrp>
    </languageGrp>

    <languageGrp>
      <language lang="CS" type="Tschechisch"/>

      <termGrp>
        <term>vyobrazení</term>

        <descripGrp>
          <descrip type="Autor">MK</descrip>
          <descrip type="Kontext">Marketing</descrip>
        </descripGrp>
      </termGrp>
    </languageGrp>
  </conceptGrp>
</mtf>

これにより、次が生成されます。

<html>
  <body>
    <h2>Terminologie</h2>
    <table>
      <tr>
        <td>Konzept-ID</td>
        <td>Deutsch</td>
        <td>Polnisch</td>
        <td>Russisch</td>
        <td>Other</td>
        <td>Tschechisch</td>
        <td>Autor</td>
        <td>Kontext</td>
      </tr>
      <tr>
        <td>1</td>
        <td>Abbildung</td>
        <td>ilustracja</td>
        <td>иллюстрация</td>
        <td>Sales</td>
        <td>vyobrazení</td>
        <td>MK</td>
        <td>Marketing</td>
      </tr>
      <tr>
        <td>1</td>
        <td></td>
        <td></td>
        <td>рисунок</td>
        <td>Marketing</td>
        <td></td>
        <td></td>
        <td></td>
      </tr>
    </table>
  </body>
</html>
于 2013-02-11T11:19:57.673 に答える