具有相同属性值的XSLT包装元素(具有行attr的表)

时间:2017-02-14 16:17:20

标签: xml xslt

我试图将XML表从较大的项目转换为HTML表格,而且我对这个XSLT游戏很陌生。我发现了很多材料,但我还没有看到任何类似这个问题的东西,所以我想我会问:

<div class="row">
  <div class="col-sm-6 tier1">
    <div class="smBox"></div>
    <div class="smBox"></div>
  </div>
  <div class="col-sm-6 tier1">
     <div class="lgBox"></div>
  </div>
</div>

我希望用<table name="my table (2 columns)"> <!-- some column headers --> <colhddef colnum="1">This is column 1</colhddef> <colhddef colnum="2">This is column 2</colhddef> <entry row="1" colnum="1">entry 1</entry> <entry row="1" colnum="2">entry 2</entry> <entry row="2" colnum="1">entry 3</entry> <entry row="2" colnum="2">entry 4</entry> <entry row="3" colnum="1">entry 5</entry> <entry row="3" colnum="2">entry 6</entry> <entry row="4" colnum="1">entry 7</entry> <entry row="4" colnum="2">entry 8</entry> </table> 包含具有公共行属性的每组条目,并且确保列正确放置在表中不会有任何损害。这可能比我制作它简单得多......但是非常感谢任何帮助!

奖励积分:在哪里可以找到适合XSLT的优质学习资源?推荐书籍?等?

提前再次感谢!

1 个答案:

答案 0 :(得分:0)

这可能会让你开始:

<xsl:template match="table">
 <table>
  <xsl:apply-templates select="entry[@colnum='1']"/>
 </table>
</xsl:template>

<xsl:template match="entry[@colnum='1']">
 <xsl:param name='row'><xsl:value-of select='@row'/></xsl:param>
 <tr>
  <td><xsl:value-of select="."/></td>
  <xsl:apply-templates select="../entry[@row=$row][@colnum!=1]"/>
 </tr>
</xsl:template>

<xsl:template match="entry[@colnum!='1']">
 <td><xsl:value-of select="."/></td>
</xsl:template>

第一个模板创建一个<table></table>,并填充它,仅选择<entry colnum='1'/>节点中的table个节点。

第二个模板将参数$row设置为row节点的值<entry colnum='1'/>属性。然后它创建一个<tr></tr>容器,并添加一个包含此条目文本的<td></td>节点。最后,它从父表中选择entryrow属性与$row参数匹配,colnum属性不是1的节点。

最后一个模板将这些选定的<entry>节点(colnum属性非1)转换为<td></td>节点。

输出:

<table>
  <tr>
    <td>entry 1</td>
    <td>entry 2</td>
  </tr>
  <tr>
    <td>entry 3</td>
    <td>entry 4</td>
  </tr>
  <tr>
    <td>entry 5</td>
    <td>entry 6</td>
  </tr>
  <tr>
    <td>entry 7</td>
    <td>entry 8</td>
  </tr>
</table>