如何以HTML表格格式显示此XML数据..?

时间:2011-12-24 08:26:29

标签: xml xslt

以下是我的XML文件 -

<School>
  <Std c="8">
    <Name>ABC</Name>
    <Age>12</Age>
    <Name>EFG</Name>
    <Age>11</Age>
    <Name>PQR</Name>
    <Age>12</Age>
    <Name>XYZ</Name>
    <Age>11</Age>
  </Std>
</School>

我希望HTML输出为 -

Name    Age
ABC     12 
EFG     11
PQR     12
XYZ     11

3 个答案:

答案 0 :(得分:6)

这是一个完全通用的解决方案,适用于任意数量的列

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:key name="kColsByName" match="Std/*"
  use="name()"/>

 <xsl:variable name="vCols" select=
  "*/*/*
        [generate-id()
        =
        generate-id(key('kColsByName', name())[1])
        ]
  "/>

 <xsl:variable name="vNumCols" select="count($vCols)"/>

 <xsl:template match="/*/Std">
     <table>
      <tr>
        <xsl:apply-templates select="$vCols"
             mode="head"/>
      </tr>
      <xsl:apply-templates select=
       "*[position() mod $vNumCols = 1]"/>
     </table>
 </xsl:template>

 <xsl:template match="Std/*" mode="head">
  <th><xsl:value-of select="name()"/></th>
 </xsl:template>

 <xsl:template match="Std/*">
  <tr>
   <xsl:apply-templates mode="inrow" select=
    "(. | following-sibling::*)
         [not(position() > $vNumCols)]"/>
  </tr>
 </xsl:template>

  <xsl:template match="Std/*" mode="inrow">
  <td><xsl:value-of select="."/></td>
 </xsl:template>
</xsl:stylesheet>

在提供的XML文档上应用此转换时

<School>
  <Std c="8">
    <Name>ABC</Name>
    <Age>12</Age>
    <Name>EFG</Name>
    <Age>11</Age>
    <Name>PQR</Name>
    <Age>12</Age>
    <Name>XYZ</Name>
    <Age>11</Age>
  </Std>
</School>

产生了想要的正确结果

<table>
   <tr>
      <th>Name</th>
      <th>Age</th>
   </tr>
   <tr>
      <td>ABC</td>
      <td>12</td>
   </tr>
   <tr>
      <td>EFG</td>
      <td>11</td>
   </tr>
   <tr>
      <td>PQR</td>
      <td>12</td>
   </tr>
   <tr>
      <td>XYZ</td>
      <td>11</td>
   </tr>
</table>

现在,如果我们向原始XML文档添加新列(例如Sex):

<School>
  <Std c="8">
    <Name>ABC</Name>
    <Age>12</Age>
    <Sex>M</Sex>
    <Name>EFG</Name>
    <Age>11</Age>
    <Sex>F</Sex>
    <Name>PQR</Name>
    <Age>12</Age>
    <Sex>F</Sex>
    <Name>XYZ</Name>
    <Age>11</Age>
    <Sex>M</Sex>
  </Std>
</School>

我们可以在不做任何修改的情况下应用上面相同的转换,并且它会再次产生正确的结果 - 这表明转换是真正的通用

<table>
   <tr>
      <th>Name</th>
      <th>Age</th>
      <th>Sex</th>
   </tr>
   <tr>
      <td>ABC</td>
      <td>12</td>
      <td>M</td>
   </tr>
   <tr>
      <td>EFG</td>
      <td>11</td>
      <td>F</td>
   </tr>
   <tr>
      <td>PQR</td>
      <td>12</td>
      <td>F</td>
   </tr>
   <tr>
      <td>XYZ</td>
      <td>11</td>
      <td>M</td>
   </tr>
</table>

答案 1 :(得分:2)

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
<xsl:output method="html" indent="yes"/>

<xsl:template match="School">
<table>
  <tr>
    <th>Name</th>
    <th>Age</th>
  </tr>
  <xsl:for-each select="Std/Name">
    <tr>
      <td>
        <xsl:value-of select="."/>
      </td>
      <td>
        <xsl:value-of select="following::Age"/>
      </td>
    </tr>
  </xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>

答案 2 :(得分:-1)

http://p2p.wrox.com/xslt/66523-create-generic-xsl-template-create-table.html

这个xslt生成通用表:

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="1.0">

  <xsl:output method="html" indent="yes"/>

  <xsl:template match="/*">
    <table border="1" >
      <thead >
        <tr bgcolor="red">
          <xsl:apply-templates select="*[1]/*" mode="th"/>
        </tr>
      </thead>
      <tbody>
        <xsl:apply-templates select="*"/>
      </tbody>
    </table>
  </xsl:template>

  <xsl:template match="/*/*/*" mode="th">
    <th>
      <xsl:value-of select="name()"/>
    </th>
  </xsl:template>

  <xsl:template match="/*/*">
    <tr>
      <xsl:apply-templates select="*"/>
    </tr>
  </xsl:template>

  <xsl:template match="/*/*/*">
    <td>
      <xsl:value-of select="."/>
    </td>
  </xsl:template>

</xsl:stylesheet>