想要使用XSL / XML创建表

时间:2012-12-12 08:18:02

标签: xml xslt

我正在尝试使用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>

它通常更长,但我剪掉了一些部分。

我希望我的桌子看起来像这样:

  • 第一栏:牛奶,水,果汁......
  • 第二栏:我想要图像。
  • 第三栏:Milk1,Water1,Juice1。
  • 第四栏: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>
  • 这与牛奶,水和果汁完美地显示第一列。
  • 第二列不起作用,它只是空白。图片不会出现在表格中,有关如何解决这个问题的想法吗?*
  • 第三栏也完美展现了Milk1,Water1,Juice1。
  • 显然,第四列不起作用,因为我使用与第三列相同的值。我不知道如何让Milk2,Water2和Juice2显示在该列中,因为它使用相同的元素名称(区域/标签)

所以我需要修复两件事:我需要修复第二列以实际显示每个框中的图像。 我还需要修复第四列以显示Milk2,Water2和Juice2。 我现在的主要问题是让第四列工作,我真的不明白如何显示Milk2,Water2等。

我还想在每个单元格中添加单选按钮或复选框,这样我就可以在我的网页中使用JavaScript。我觉得每个盒子都需要一个不同的ID,所以我不知道如何使用XSL实现它,因为它只是通过XML文件进行“循环”,所以我不确定如何添加一个单选按钮,或每个单元格中的复选框。 *现在这不是那么重要了,在我宁愿帮助我之前提到的内容之后,我会继续努力,但这也会有所帮助。

编辑:

我有两个问题。 我设法通过这样做来添加复选框:

<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的细胞完全消失,但它仍然存在,带有一个复选框。

1 个答案:

答案 0 :(得分:4)

对于第二列,您正在执行此操作

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

对于第三和第四列,您可以添加一个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>