0

多くの未知数を含む非常に大きな XML ファイルの抜粋があります。この XML ファイルには多数の conceptGrp が含まれており、それぞれにさまざまな数の languageGrp/languages を含めることができ、さらにさまざまな数の用語を含めることができます。

<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>

これらのさまざまな可能性に対応する html テーブルが必要です。テーブルの形式は次のとおりです。

言語ごとに (いくつであっても) 別の行、用語ごとに別の行 – 以下のように: 複数の用語がある場合、それらは同義語として扱われ、以下の例。

Concept Deutsch Polnisch    Russisch    Tschechisch

1   Abbildung   ilustracja  иллюстрация vyobrazení

1                           рисунок 

私の問題: 最初の languageGrp に複数の用語が含まれる場合もあれば、3 番目の用語が含まれる場合もあります。conceptGrp をグループ化しようとしましたが、複雑な方法でも問題はありませんでした-) これが機能する私のバージョンですが、それを次のように適応させる必要があります。新しいファイルごとに、言語や用語などの数がわからないため、.

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="utf-8" indent="yes"/>
<xsl:template match="mtf">
  <html>
  <body>
  <h2>Terminologie</h2>
  <xsl:apply-templates/>
  </body>
  </html> 
</xsl:template> 


<xsl:template match="conceptGrp">
<xsl:for-each select=".">
<table>

<tr> <!--Zeile 1-->
<td>Konzept-ID</td>
<xsl:for-each select="languageGrp">
<td><xsl:value-of select="language/@type"/></td> <!--Spalte2-->
</xsl:for-each>
</tr>

<tr> <!--Zeile 2-->
<td><xsl:value-of select="concept"/></td> <!--Spalte1-->
<xsl:for-each select="languageGrp//termGrp[1]">
<td><xsl:value-of select="term"/></td> <!--Spalte2-->
</xsl:for-each>
</tr>

<xsl:if test="languageGrp//termGrp[2]">
<tr>
<td><xsl:value-of select="concept"/></td>
<td><xsl:value-of select="languageGrp[1]//termGrp[2]/term"/></td>
<td><xsl:value-of select="languageGrp[2]//termGrp[2]/term"/></td>
<td><xsl:value-of select="languageGrp[3]//termGrp[2]/term"/></td>
<td><xsl:value-of select="languageGrp[4]//termGrp[2]/term"/></td>
</tr>
</xsl:if>

</table>
</xsl:for-each>
</xsl:template>


</xsl:stylesheet>

誰かがもっとエレガントでグローバルな方法でプッシュしてくれませんか? これは非常にありがたいです。

4

1 に答える 1

1

これは私が思いつくことができる最高のデザインでしたが、必要なものはすべて揃っていると思います。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="html" encoding="utf-8" indent="yes"/>
  <xsl:key name="kLang" match="languageGrp" use="language/@lang" />
  <xsl:variable name="uniqueLangs"
                select="/mtf/conceptGrp/languageGrp
                  [generate-id() =  generate-id(key('kLang', language/@lang)[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 select="conceptGrp" />
        </table>
      </body>
    </html>
  </xsl:template>

  <xsl:template match="languageGrp" mode="header">
    <td>
      <xsl:value-of select="language/@type"/>
    </td>
  </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="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">
    <xsl:variable name="pos" select="position()" />
    <xsl:variable name="currConcept" select="../.." />
    <tr>
      <td>
        <xsl:value-of select="$currConcept/concept"/>
      </td>
      <!-- Iterate through all of the distinct languages -->
      <xsl:for-each select="$uniqueLangs">
        <td>
          <!-- Get the term for the current language and position,
                 within the current concept -->
          <xsl:value-of 
            select="$currConcept/languageGrp
                       [language/@lang = current()/language/@lang]
                          /termGrp[$pos]/term"/>
        </td>
      </xsl:for-each>
    </tr>
  </xsl:template>
</xsl:stylesheet>

サンプル入力で実行すると、次が生成されます。

<html>
  <body>
    <h2>Terminologie</h2>
    <table>
      <tr>
        <td>Konzept-ID</td>
        <td>Deutsch</td>
        <td>Polnisch</td>
        <td>Russisch</td>
        <td>Tschechisch</td>
      </tr>
      <tr>
        <td>1</td>
        <td>Abbildung</td>
        <td>ilustracja</td>
        <td>иллюстрация</td>
        <td>vyobrazení</td>
      </tr>
      <tr>
        <td>1</td>
        <td></td>
        <td></td>
        <td>рисунок</td>
        <td></td>
      </tr>
    </table>
  </body>
</html>

最初の試みは、各コンセプトを別の表にまとめようとしていたように見えましたが、それは意図的なものでしたか? 各コンセプトの言語だけを別のテーブルに入れたいですか、それともすべてのコンセプトを 1 つのテーブルにまとめて使用可能なすべての言語を入れたいですか?

于 2013-02-05T16:09:20.667 に答える