从具有多个属性的节点创建XML XSL表

时间:2014-06-29 08:40:55

标签: html xml xslt html-table

我想基于以下XML表创建一个包含XSL的HTML表。目标是创建一个包含所有公司名称及其所有产品名称的表。

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="style.xsl"?>

<Companies>
   <Company CompanyID="1">
   <CompanyInfo>
   <Name>ABC</Name>
   <ProductNames>
      <ProductName Name="Product 1" />
      <ProductName Name="Product 2" />
      <ProductName Name="Product 3" />
      <ProductName Name="Product 4" />
    </ProdcutNames>
  </CompanyInfo>
  </Company>

   <Company CompanyID="2">
   <CompanyInfo>
   <Name>TVM</Name>
   <ProductNames>
      <ProductName Name="Product A" />
      <ProductName Name="Product B" />
      <ProductName Name="Product C" />
      <ProductName Name="Product D" />
    </ProdcutNames>
</CompanyInfo>
</Company>
</Companies>

目前我有以下XSL表(这还不够)。

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>

<xsl:template match="/">

<html>
<body>
 <h2>Table View</h2>
 <table border="1">
    <th>Name</th>
    <th>ProductName</th>
  </tr>

  <xsl:for-each select="Companies/Company/CompanyInfo">
  <tr>
      <td><xsl:value-of select="Name" /></td>
      <td><xsl:value-of select="ProductNames/ProductName/@Name" /></td> 
  </tr>
  </xsl:for-each>

 </table>
 </body>
 </html>
 </xsl:template>

 </xsl:stylesheet>

目标输出应如下所示:

<table>
<tr>
<th>CompanyName</th>
<th>ProductName</th>
</tr>
<tr>
<td>ABC</td>
<td>Product 1</td>
</tr>
<tr>
<td>ABC</td>
<td>Product 2</td>
</tr>
<tr>
<td>ABC</td>
<td>Product 3</td>
</tr>
<tr>
<td>ABC</td>
<td>Product 4</td>
</tr>

<tr>
<td>TVM</td>
<td>Product A</td>
</tr>
<tr>
<td>TVM</td>
<td>Product B</td>
</tr>
<tr>
<td>TVM</td>
<td>Product C</td>
</tr>
<tr>
<td>TVM</td>
<td>Product D</td>
</tr>
</table>

目前,我只能查看每家公司的1种产品,但不能全部查看。因此,我的目标是为每个产品创建一个具有相应公司名称的行。

如果有人可以帮助我,真的很棒!

1 个答案:

答案 0 :(得分:1)

更改

  <xsl:for-each select="Companies/Company/CompanyInfo">
  <tr>
      <td><xsl:value-of select="Name" /></td>
      <td><xsl:value-of select="ProductNames/ProductName/@Name" /></td> 
  </tr>
  </xsl:for-each>

  <xsl:for-each select="Companies/Company/CompanyInfo/ProductNames/ProductName/@Name">
  <tr>
      <td><xsl:value-of select="ancestor::CompanyInfo/Name" /></td>
      <td><xsl:value-of select="." /></td> 
  </tr>
  </xsl:for-each>