1

XML ドキュメントがあります。

<Gym>

<Trainee>
    <Trainee_ID>1521</Trainee_ID>
    <Trainee_Name>Mary Andersen</Trainee_Name>
    <Trainee_Age>23</Trainee_Age>
</Trainee>

<Trainee>
    <Trainee_ID>1522</Trainee_ID>
    <Trainee_Name>Jane Sellers</Trainee_Name>
    <Trainee_Age>56</Trainee_Age>
</Trainee>

<Trainee>
    <Trainee_ID>1523</Trainee_ID>
    <Trainee_Name>Julie Aniston</Trainee_Name>
    <Trainee_Age>32</Trainee_Age>
</Trainee>

<Class>
    <Trainee_ID>1521</Trainee_ID>
    <Course_ID>A21</Course_ID>
    <Class_Room>A1</Class_Room>
</Class>

<Class>
    <Trainee_ID>1522</Trainee_ID>
    <Course_ID>A22</Course_ID>
    <Class_Room>B2</Class_Room>
</Class>

<Class>
    <Trainee_ID>1523</Trainee_ID>
    <Course_ID>B24</Course_ID>
    <Class_Room>B3</Class_Room>
</Class>

<Course>
    <Course_ID>A21</Course_ID>
    <Course_Title>Yoga</Course_Title>
    <Course_Hours_Per_Week>2</Course_Hours_Per_Week>
</Course>

<Course>
    <Course_ID>A22</Course_ID>
    <Course_Title>Pilates</Course_Title>
    <Course_Hours_Per_Week>2</Course_Hours_Per_Week>
</Course>

<Course>
    <Course_ID>B24</Course_ID>
    <Course_Title>Aerobic</Course_Title>
    <Course_Hours_Per_Week>3</Course_Hours_Per_Week>
</Course>

</Gym>

私がやりたいことは、XSL で 3 つのテーブルを作成することです。ヘッダーは子要素の名前 (1 回のみ)、サブヘッダーは孫要素の名前 (1 回のみ) で、残りの行と列には値が入力されます。孫要素の。

これは私が得た限りです:

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

<xsl:template match="/Gym">
    <html>
    <body>
        <xsl:for-each select="*">
            <table border="1">
            <tr>
            <xsl:if test="position()='1' or position()='4' or position()='7'">
            <xsl:value-of select="translate(name(.), 'abcdefghijklnmopqrstuvwxyz', 'ABCDEFGHIJKLNMOPQRSTUVWXYZ')"/>     
            </xsl:if>
            </tr>
            <tr>
            <xsl:if test="position()='1' or position()='4' or position()='7'">
                <xsl:for-each select="*">
                <th><xsl:value-of select="name(.)"/></th>
                </xsl:for-each>
            </xsl:if>
            </tr>
            <tr>        
            <xsl:for-each select="*">   
                <th>            
                <xsl:value-of select="."/>
                </th>
            </xsl:for-each>
            </tr>
            </table>
            <p></p>
        </xsl:for-each>
    </body>
    </html>
</xsl:template>
</xsl:stylesheet>

これは出力です:

出力
(出典: UploadScreenshot.com )

何が起こっているかというと、サブ要素ごとに新しいテーブルが作成されるたびに、3 つのテーブルすべてを自動的に作成し、ヘッダーとサブヘッダーを作成し、その後データを入力するスマート コードが必要です。 . 私が欲しいのは次のようなものです(色とテキストのフォーマットは無視してください):

出力

XSLT コードで実行したいのは、要素インスタンスごとに 1 つのテーブルを作成し、要素の名前をヘッダーとして配置した後、サブ要素をヘッダーとして 1 回配置してから、テーブルにデータを入力することです。

4

1 に答える 1

3

ここで使用するアプローチは、Muenchian のグループ化とキーを使用して、個別のグループとそのメンバーを見つけることです。私はこれがうまくいくと信じています:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
  <xsl:key name="kCategory" match="/*/*" use="local-name()"/>

  <xsl:template match="/*">
    <div>
      <xsl:apply-templates 
        select="*[generate-id() = generate-id(key('kCategory', local-name())[1])]" />
    </div>
    </xsl:template>

  <xsl:template match="/*/*">
    <table>
      <tr class="table-header odd-row">
        <th colspan="3">
          <xsl:value-of select="local-name()"/>
        </th>
      </tr>
      <tr class="column-headers">
        <xsl:apply-templates select="*" mode="colHeader" />
      </tr>
      <xsl:apply-templates select="key('kCategory', local-name())" mode="row"/>
    </table>
  </xsl:template>

  <xsl:template match="/*/*/*" mode="colHeader">
    <td>
      <xsl:value-of select="local-name()"/>
    </td>
  </xsl:template>

  <xsl:template match="/*/*" mode="row">
    <tr>
      <xsl:if test="position() mod 2 = 1">
        <xsl:attribute name="class">odd-row</xsl:attribute>
      </xsl:if>
      <xsl:apply-templates select="*" mode="value" />
    </tr>
  </xsl:template>

  <xsl:template match="/*/*/*" mode="value">
    <td>
      <xsl:value-of select="." />
    </td>
  </xsl:template>
</xsl:stylesheet>

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

<div>
  <table>
    <tr class="table-header odd-row">
      <th colspan="3">Trainee</th>
    </tr>
    <tr class="column-headers">
      <td>Trainee_ID</td>
      <td>Trainee_Name</td>
      <td>Trainee_Age</td>
    </tr>
    <tr class="odd-row">
      <td>1521</td>
      <td>Mary Andersen</td>
      <td>23</td>
    </tr>
    <tr>
      <td>1522</td>
      <td>Jane Sellers</td>
      <td>56</td>
    </tr>
    <tr class="odd-row">
      <td>1523</td>
      <td>Julie Aniston</td>
      <td>32</td>
    </tr>
  </table>
  <table>
    <tr class="table-header odd-row">
      <th colspan="3">Class</th>
    </tr>
    <tr class="column-headers">
      <td>Trainee_ID</td>
      <td>Course_ID</td>
      <td>Class_Room</td>
    </tr>
    <tr class="odd-row">
      <td>1521</td>
      <td>A21</td>
      <td>A1</td>
    </tr>
    <tr>
      <td>1522</td>
      <td>A22</td>
      <td>B2</td>
    </tr>
    <tr class="odd-row">
      <td>1523</td>
      <td>B24</td>
      <td>B3</td>
    </tr>
  </table>
  <table>
    <tr class="table-header odd-row">
      <th colspan="3">Course</th>
    </tr>
    <tr class="column-headers">
      <td>Course_ID</td>
      <td>Course_Title</td>
      <td>Course_Hours_Per_Week</td>
    </tr>
    <tr class="odd-row">
      <td>A21</td>
      <td>Yoga</td>
      <td>2</td>
    </tr>
    <tr>
      <td>A22</td>
      <td>Pilates</td>
      <td>2</td>
    </tr>
    <tr class="odd-row">
      <td>B24</td>
      <td>Aerobic</td>
      <td>3</td>
    </tr>
  </table>
</div>

色とスタイリングはあなたが扱えると思いますか?class適切だと思われる2 つの属性を追加しました。

必要なスタイルを取得するには、次のような CSS を使用できるはずです (適切なスタイルを取得するには、多少の調整が必要ですが、これが一般的な考え方です。

th, td
{
    border: 2px solid #9BBA58;
    background-color: #E6EDD4;
}

tr.table-header th, tr.column-headers td
{
    font-weight: bold;
}

tr.table-header th
{
    border-bottom: 4px solid #9BBA58;
}

tr.odd-row th, tr.odd-row td
{
    background-color: white;
}
于 2013-01-30T14:41:35.003 に答える