2

XSL/XML を使用してテーブルを作成しようとしています。私は XSL と XML を初めて使用するので、簡単に説明してください。いくつか問題が発生しています。これは私のXMLファイルです:

<List>
<Classification>
    <Class>
        <Label>Milk</Label>
        <NumberZone>1</NumberZone>

        <Zone>
            <Label>Milk1</Label>
            <Frontier>500</Frontier>
        </Zone>

        <Zone>
            <Label>Milk2</Label>
            <Frontier>600</Frontier>
        </Zone>

        <Zone>
            <Label>Milk3</Label>
            <Frontier>600</Frontier>
        </Zone>

        <Zone>
            <Label>Milk4</Label>
            <Frontier>700</Frontier>
        </Zone>

        <image>
            <File>milk.jpg</File>
        </image>
    </Class>

    <Class>
        <Label>Water</Label>
        <NumberZone>2</NumberZone>

        <Zone>
            <Label>Water1</Label>
            <Frontier>800</Frontier>
        </Zone>

        <Zone>
            <Label>Water2</Label>
            <Frontier>900</Frontier>
        </Zone>

        <image>
            <File>water.jpg</File>
        </image>
    </Class>

    <Class>
        <Label>Juice</Label>
        <NumberZone>3</NumberZone>

        <Zone>
            <Label>Juice1</Label>
            <Frontier>950</Frontier>
        </Zone>

        <Zone>
            <Label>Juice2</Label>
            <Frontier>990</Frontier>
        </Zone>

        <image>
            <File>juice.jpg</File>
        </image>
    </Class>

</Classification>
</List>

通常はもっと長いのですが、一部カットしています。

テーブルを次のように表示します。

  • 最初の列: 牛乳、水、ジュース...
  • 2 番目の列: 画像が必要です。
  • 3 列目: Milk1、Water1、Juice1。
  • 4 列目: Milk2、Water2、Juice2。
  • (等々)。

これまでのところ、私はこれを持っています:

<table border="1">

 <tr><th>Column 1</th><th>Image</th><th>Column 3</th></tr>


        <xsl:for-each select="Classification/Class">
        <tr>
            <td><em><xsl:value-of select="Label" /></em></td>

            <td>
            <xsl:attribute name="src">
            <xsl:value-of select="image/File"/>
            </xsl:attribute>
            </td>

            <td><xsl:value-of select="Zone/Label"/></td>
            <td colspan="1"><xsl:value-of select="Zone/Label"/></td>
            <td colspan="1"><xsl:value-of select="Zone/Label"/></td>
            </tr>
        </xsl:for-each>
</table>
  • これにより、最初の列がミルク、水、ジュースで完全に表示されます。
  • 2 番目の列は機能しません。空白です。画像がテーブルに表示されません。これを修正する方法はありますか?*
  • 3 番目の列も完璧に機能し、Milk1、Water1、Juice1 を示しています。
  • 4 列目は明らかに機能しません。3 列目と同じ value-of を使用しているためです。同じ要素名 (Zone/Label) を使用しているため、Milk2、Water2、および Juice2 をその列に表示する方法がわかりません。

したがって、修正する必要があることが 2 つあります。各ボックスに実際に画像を表示するには、2 番目の列を修正する必要があります。また、4 番目の列を修正して、Milk2、Water2、および Juice2 を表示する必要があります。今のところ私の主な問題は、4 番目の列を機能させることです。Milk2、Water2 などを表示する方法が本当にわかりません。

また、Web ページで JavaScript を使用できるように、後で各セルにラジオ ボタンまたはチェック ボックスを追加したいと考えています。ボックスごとに異なる ID が必要になると思うので、XSL を使用してそれを実現する方法がわかりません。XML ファイルを「ループ」するだけなので、ラジオ ボタンを追加する方法がわかりません。 、または各セルのチェック ボックス。* これは今のところそれほど重要ではありません。前に述べたことについて助けが必要な場合は後で作業しますが、これも役に立ちます。

編集:

2 つの問題があります。次のようにして、チェックボックスを追加することができました。

<td colspan="1"><input type="checkbox" name="Zone1" id="Zone1" /><xsl:value-of select="Zone[1]/Label"/></td>
<td colspan="1"><input type="checkbox" name="Zone2" id="Zone1" /><xsl:value-of select="Zone[2]/Label"/></td>
<td colspan="1"><input type="checkbox" name="Zone3" id="Zone1"/> <xsl:value-of select="Zone[3]/Label"/></td>
<td colspan="1"><input type="checkbox" name="Zone4" id="Zone1" /><xsl:value-of select="Zone[4]/Label"/></td>

問題は、各列のすべての要素が同じ ID を持つと思うことです。すべての ID が異なるように変更するにはどうすればよいですか?

また、私の質問の XML ファイルからはわかりませんが、後で、Milk4 などしかありません。つまり、Water4 と Juice4 のセルを完全に非表示にしたいのですが、まだそこにあり、チェック ボックスが空になっています。

4

1 に答える 1

4

2番目の列では、これを行っています

<td>
   <xsl:attribute name="src">
   <xsl:value-of select="image/File"/>
   </xsl:attribute>
</td>

しかし、これは次のHTMLになります

<td src="milk.jpg" />

ただし、実際には画像を表示するにはimgタグを使用する必要があるため、代わりにこれを行います。

<td>
   <img src="{image/File}" />
</td>

3 列目と 4 列目については、xpath 式を追加して位置を指定できます。

<xsl:value-of select="Zone[1]/Label"/>
<xsl:value-of select="Zone[2]/Label"/>

実際、コードの繰り返しを避けるために、ここでテンプレート マッチングを使用する方がよい場合があります。

 <xsl:apply-templates select="Zone[position() &lt; 3]" />

 <xsl:template match="Zone">
     <xsl:value-of select="Label"/>
 </xsl:template>

これを拡張してチェックボックスを表示したい場合は、次のようにすることができます

<xsl:template match="Zone">
   <xsl:variable name="index">
      <xsl:number />
   </xsl:variable>
   <input type="checkbox" name="Zone{$index}" id="Zone{$index}" />
   <xsl:value-of select="Label"/>
</xsl:template>

これが「属性値テンプレート」を使用して ID を出力する方法に注意してください。中括弧 { } は、文字どおりの出力ではなく、評価される式であることを示します。

ここに完全な XSLT があります

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="xml" indent="yes"/>

   <xsl:template match="/List">
      <table border="1">
         <tr>
            <th>Column 1</th>
            <th>Image</th>
            <th>Column 3</th>
         </tr>
         <xsl:for-each select="Classification/Class">
            <tr>
               <td>
                  <em>
                     <xsl:value-of select="Label"/>
                  </em>
               </td>
               <td>
                  <img src="{image/File}"/>
               </td>
               <td colspan="1"><xsl:apply-templates select="Zone[1]" /></td>
               <td colspan="1"><xsl:apply-templates select="Zone[2]" /></td>
               <td colspan="1"><xsl:apply-templates select="Zone[3]" /></td>
               <td colspan="1"><xsl:apply-templates select="Zone[4]" /></td>
            </tr>
         </xsl:for-each>
      </table>
   </xsl:template>

   <xsl:template match="Zone">
      <xsl:variable name="index">
         <xsl:number />
      </xsl:variable>
      <input type="checkbox" name="Zone{$index}" id="Zone{$index}" />
      <xsl:value-of select="Label"/>
   </xsl:template>
</xsl:stylesheet>

XML に適用すると、以下が出力されます。

<table border="1">
   <tr>
      <th>Column 1</th>
      <th>Image</th>
      <th>Column 3</th>
   </tr>
   <tr>
      <td>
         <em>Milk</em>
      </td>
      <td>
         <img src="milk.jpg"/>
      </td>
      <td colspan="1">
         <input type="checkbox" name="Zone1" id="Zone1"/>Milk1</td>
      <td colspan="1">
         <input type="checkbox" name="Zone2" id="Zone2"/>Milk2</td>
      <td colspan="1">
         <input type="checkbox" name="Zone3" id="Zone3"/>Milk3</td>
      <td colspan="1">
         <input type="checkbox" name="Zone4" id="Zone4"/>Milk4</td>
   </tr>
   <tr>
      <td>
         <em>Water</em>
      </td>
      <td>
         <img src="water.jpg"/>
      </td>
      <td colspan="1">
         <input type="checkbox" name="Zone1" id="Zone1"/>Water1</td>
      <td colspan="1">
         <input type="checkbox" name="Zone2" id="Zone2"/>Water2</td>
      <td colspan="1"/>
      <td colspan="1"/>
   </tr>
   <tr>
      <td>
         <em>Juice</em>
      </td>
      <td>
         <img src="juice.jpg"/>
      </td>
      <td colspan="1">
         <input type="checkbox" name="Zone1" id="Zone1"/>Juice1</td>
      <td colspan="1">
         <input type="checkbox" name="Zone2" id="Zone2"/>Juice2</td>
      <td colspan="1"/>
      <td colspan="1"/>
   </tr>
</table>
于 2012-12-12T08:57:50.923 に答える