2016-11-07 2 views
1

データ固有のヘッダーと列数を持つHTMLテーブルコードを作成できる1つのXSLスタイルシートを作成したいとします。 (参照私はテーブルヘッダを考え出した動的XMLデータ用のXSLスタイルシート

<table> 
    <thead> 
    <th>postId</th><th>id</th><th>name</th><th>email</th><th>body</th> 
    </thead> 
    <tbody> 
    <tr> 
     <td>1</td><td>1</td><td>mane 1</td><td>[email protected]</td><td>body 1</td> 
    </tr> 
    <tr> 
     <td>1</td><td>2</td><td>mane 2</td><td>[email protected]</td><td>body 2</td> 
    </tr> 
    </tbody> 

<table> 
    <thead> 
    <th>id</th><th>desc</th><th>Note</th> 
    </thead> 
    <tbody> 
    <tr> 
     <td>1</td><td>desc 1</td><td>Note 1</td> 
    </tr> 
    <tr> 
     <td>2</td><td>desc 2</td><td>Note 2</td> 
    </tr> 
    <tr> 
     <td>3</td><td>desc 3</td><td>Note 3</td> 
    </tr> 
    </tbody> 
</table> 

:ここで私がしたいデータの2つの例のセットは1つのスタイルシートで

<root> 
     <row> 
     <postId>1</postId> 
     <id>1</id> 
     <name>name 1</name> 
     <email>[email protected]</email> 
     <body>body 1</body> 
     </row> 
     <row> 
     <postId>1</postId> 
     <id>2</id> 
     <name>name 2</name> 
     <email>[email protected]</email> 
     <body>body 2</body> 
     </row> 
</root> 

<root> 
     <row> 
     <id>1</id> 
     <desc>desc 1</desc> 
     <Note>Note 1</Note> 
     </row> 
     <row> 
     <id>2</id> 
     <desc>desc 2</desc> 
     <Note>Note 2</Note> 
     </row> 
     <row> 
     <id>3</id> 
     <desc>desc 3</desc> 
     <Note>Note 3</Note> 
     </row> 
</root> 

を処理しているそして、私のような出力を生成するためのシートが欲しいです私は身体を働かせるようには見えない。私は名前がわからない、あるいは存在していても要素の値を表示する方法を理解できません。

<?xml version="1.0"?> 

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:template match="root"> 
    <html> 
    <body> 
     <h2>My Table Data</h2> 
     <table border="1"> 
      <thead> 
      <tr bgcolor="#9acd32"> 
       <xsl:for-each select="row[1]/*"> 
       <th><xsl:value-of select ="name(.)"/></th>   
       </xsl:for-each> 
      </tr> 
      </thead> 
      <tbody> 
      ????? 
      </tbody> 

答えて

1

あなたrow要素の場合は、常に同じ要素数を持ち、同じ順序で、あなたが名前を心配する必要があり、あなたではないでしょう????? row要素が異なる順序で要素、あるいは、あなたは可能性があり(最初の行は、常に完了したと仮定した場合)、その後、行方不明を持っていることができれば、単に、一方

<xsl:for-each select="row"> 
    <tr> 
     <xsl:for-each select="*"> 
     <td> 
      <xsl:value-of select="." /> 
     </td> 
     </xsl:for-each> 
    </tr> 
</xsl:for-each> 

....これによって置き換えることができます"ヘッダ"行セルを保持する変数を定義する

<xsl:variable name="headers" select="row[1]/*"/> 

このなり...

<xsl:for-each select="row"> 
    <xsl:variable name="currentRow" select="."/> 
    <tr> 
     <xsl:for-each select="$headers"> 
     <xsl:variable name="currentHeaderName" select="name()" /> 
      <td> 
       <xsl:value-of select="$currentRow/*[name() = $currentHeaderName]"/> 
      </td> 
     </xsl:for-each> 
    </tr> 
    </xsl:for-each> 

は、このXSLTを試してみてください

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:template match="root"> 
     <html> 
     <body> 
      <h2>My Table Data</h2> 
      <xsl:variable name="headers" select="row[1]/*"/> 
      <table border="1"> 
       <thead> 
        <tr bgcolor="#9acd32"> 
        <xsl:for-each select="$headers"> 
         <th> 
          <xsl:value-of select="name(.)"/> 
         </th>   
        </xsl:for-each> 
        </tr> 
       </thead> 
       <tbody> 
        <xsl:for-each select="row"> 
        <xsl:variable name="currentRow" select="."/> 
        <tr> 
         <xsl:for-each select="$headers"> 
         <xsl:variable name="currentHeaderName" select="name()" /> 
          <td> 
           <xsl:value-of select="$currentRow/*[name() = $currentHeaderName]"/> 
          </td> 
         </xsl:for-each> 
        </tr> 
        </xsl:for-each> 
       </tbody> 
      </table> 
      </body> 
     </html> 
    </xsl:template> 
</xsl:stylesheet> 
+0

どうもありがとうございました! –

関連する問題