XSL迭代相同标记的元素

时间:2018-03-22 17:14:05

标签: xml xslt-1.0

我正在学习XSD,到目前为止,我试图用HTML来转换XML结果不好。 我有这个XML文件:

<?xml version="1.0" encoding="UTF-8"?>
<sales>
  <division id="North">
    <revenue>10</revenue>
    <growth>9</growth>
    <bonus>7</bonus>
  </division>
  <division id="South">
    <revenue>4</revenue>
    <growth>3</growth>
    <bonus>4</bonus>
    </division>
  <division id="West">
    <revenue>6</revenue>
    <growth>-1.5</growth>
    <bonus>2</bonus>
  </division>
</sales>

使用XSL我想要这个:

Expected Results

这是我的XSL代码:

<?xml version="1.0" encoding="UTF-8"?>
 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:template match="/sales">
    <table border = "1" >
      <tr>
         <th>Division</th>
         <th>Revenue</th>
         <th>Growth</th>
         <th>Bonus</th>
      </tr>
      <xsl:apply-templates select ="/sales/division"/>   
    </table>  
  </xsl:template>
 <xsl:template match="/sales/division">
    <tr>
      <td><xsl:value-of select ="/sales/division/@id"/> </td>
      <td><xsl:value-of select ="/sales/division/revenue"/> </td>
      <td><xsl:value-of select ="/sales/division/growth"/> </td>
      <td><xsl:value-of select ="/sales/division/bonus"/> </td>
    </tr>
 </xsl:template>
</xsl:stylesheet>

我得到了这个:

Results

我也尝试过:

<xsl:for-each select ="/sales/division" >
 <tr>
  <td><xsl:value-of select ="/sales/division/@id"/> </td>
  <td><xsl:value-of select ="/sales/division/revenue"/> </td>
  <td><xsl:value-of select ="/sales/division/growth"/> </td>
  <td><xsl:value-of select ="/sales/division/bonus"/> </td>
 </tr>

但我有同样糟糕的结果。

1 个答案:

答案 0 :(得分:2)

你想要这样的XSL:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <xsl:apply-templates select="sales"/>
    </xsl:template>

    <xsl:template match="sales">
        <table border = "1" >
           <tr>
               <th>Division</th>
               <th>Revenue</th>
               <th>Growth</th>
               <th>Bonus</th>
           </tr>
           <xsl:apply-templates select ="division"/>   
        </table>  
    </xsl:template>

    <xsl:template match="division">
        <tr>
            <td><xsl:value-of select ="@id"/> </td>
            <td><xsl:value-of select ="revenue"/> </td>
            <td><xsl:value-of select ="growth"/> </td>
            <td><xsl:value-of select ="bonus"/> </td>
        </tr>
    </xsl:template>
</xsl:stylesheet>

这会产生如下结果:

Result

您一直在使用absolute路径,而不是relative路径到当前节点

通过使用类似/sales/division/@id的绝对路径,它总会选择第一个路径。一旦你理解了绝对相对的概念,你应该没问题。

请注意,您在问题中声明希望将它们列为 North,West,South ,但这不是文件中元素的顺序。