2012-04-23 8 views
1

ここに初めて。私はこのサイトで多くを検索し、私の質問に投稿するチャンスを取るので、私の問題と同様の例を見つけていない。XSLTを使用してXMLファイル内の兄弟の子ノードをXHTMLテーブルにマージする方法

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> 

だから基本的に私はBlah.NameするMetaTest名と行なるように各列を持つようにしたいとBla.MesaTestAとMetaTestBの結果(任意の数の列が存在する可能性があります)

2つのテーブルのデータをどのようにマージするのか分かりません(TestB帽子には両方のテストの結果があるので)、同じ行に表示することができます。 TestCの2番目の列にのみ同じ問題があります。

これはグループ化の問題である、あなたの助けのために

よろしく

アンドレ・クロード・

答えて

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])]"/> 

すなわちその名のキーの最初の要素であることを起こる何とか要素を検索します。

そして、各何とか要素については、出力結果同定要素に対応します。ここで

がいっぱいXSLTである:あなたのサンプルXMLに適用された場合

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

、次は(XSLT2.0では、あなたがXSLを利用することができ、出力

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

次のとおりです。 for-each-groupグループ化を簡素化する

+1

ありがとうございました!仕事は完璧でしたが、私は列スパンを列スパンに変更するだけでした。私は鍵について読んだことがあり、それは何とか解決策の一部だと分かっていましたが、それを理解することはできませんでした。この解決策は十分に考えられており、あなたは完全な見知らぬ人を助けるためにあなた自身の時間を費やしたことに感謝します。あなたはインターネットをとても素晴らしいものにしています。ありがとうございました ! – MannyCalavera

関連する問題