1

ここで初めて。このサイトでたくさん検索しましたが、私の問題に似た例が見つからなかったので、質問を投稿する機会があります。

XSLT変換を使用してXHTMLに変換したい次のXMLドキュメントがあります。

XML入力:

<Procedure Analyse="MyAnalysis1">
  <Identification Name="MetaTestA">
    <Blah Name="TestA" Result="1" /> 
    <Blah Name="TestB" Result="2" /> 
  </Identification>
  <Identification Name="MetaTestB">
    <Blah Name="TestB" Result="3" /> 
    <Blah Name="TestC" Result="4" /> 
 </Identification>
</Procedure>

期待されるXHTML出力:

<table>
  <thead>
    <tr>MyAnalysis1</tr>
    <tr>
      <td></td>
      <td>MetaTestA</td>
      <td>MetaTestB</td>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>TestA</td>
      <td>1</td>
      <td></td>
    </tr>
    <tr>
      <td>TestB</td>
      <td>2</td>
      <td>3</td>
    </tr>
    <tr>
      <td>TestC</td>
      <td></td>
      <td>4</td>
    </tr>
  </tbody>
</table>

したがって、基本的には、各列をMetaTest名にし、行をMetaTestAとMetaTestBのBlah.NameとBlah.Resultにします(任意の数の列が存在する可能性があります)

2つのテーブルのデータをマージして(両方のテストの結果が記載されているTestBを参照)、同じ行に表示できるようにする方法を理解するのに苦労しています。2列目にのみ存在するはずのTestCの同じ問題。

ご協力ありがとうございました、

よろしく

アンドレ・クロード

4

1 に答える 1

3

これはグループ化の問題です。テスト結果を名前でグループ化する必要があります。これを行う方法は、XSLT1.0とXSLT2.0のどちらを使用しているかによって異なります。Muenchianグループ化と呼ばれる手法を使用するXSLT1.0ソリューションを紹介します。

最初に、テスト要素を検索するためのキープを定義します

<xsl:key name="Tests" match="Blah" use="@Name"/>

次に、各グループ(出力テーブルの行に対応)の最初のテスト結果を見つけるには、次のようにします。

<xsl:apply-templates 
   select="Identification/Blah[generate-id() = generate-id(key('Tests', @Name)[1])]"/>

つまり、その名前のキーの最初の要素であるBlah要素を見つけます。

次に、 Blah要素ごとに、 Identification要素に対応する結果を出力します。

完全なXSLTは次のとおりです。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="xml" indent="yes"/>
   <xsl:key name="Tests" match="Blah" use="@Name"/>
   <xsl:template match="Procedure">
      <table>
         <thead>
            <tr>
               <td rowspan="{count(Identification) + 1}">
                  <xsl:value-of select="@Analyse"/>
               </td>
            </tr>
            <tr>
               <td/>
               <xsl:apply-templates select="Identification" mode="header"/>
            </tr>
         </thead>
         <tbody>
            <xsl:apply-templates select="Identification/Blah[generate-id() = generate-id(key('Tests', @Name)[1])]"/>
         </tbody>
      </table>
   </xsl:template>

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

   <xsl:template match="Identification" mode="test">
      <xsl:param name="Name"/>
      <td>
         <xsl:value-of select="Blah[@Name=$Name]/@Result"/>
      </td>
   </xsl:template>

   <xsl:template match="Blah">
      <tr>
         <td>
            <xsl:value-of select="@Name"/>
         </td>
         <xsl:apply-templates select="//Identification" mode="test">
            <xsl:with-param name="Name" select="@Name"/>
         </xsl:apply-templates>
      </tr>
   </xsl:template>
</xsl:stylesheet>

サンプルXMLに適用すると、次のように出力されます。

<table>
   <thead>
      <tr>
         <td rowspan="3">MyAnalysis1</td>
      </tr>
      <tr>
         <td/>
         <td>MetaTestA</td>
         <td>MetaTestB</td>
      </tr>
   </thead>
   <tbody>
      <tr>
         <td>TestA</td>
         <td>1</td>
         <td/>
      </tr>
      <tr>
         <td>TestB</td>
         <td>2</td>
         <td>3</td>
      </tr>
      <tr>
         <td>TestC</td>
         <td/>
         <td>4</td>
      </tr>
   </tbody>
</table>

(XSLT2.0では、xsl:for-each-groupを使用して、グループ化を簡素化できます)

于 2012-04-23T22:17:40.990 に答える