需要从 XML 属性创建 HTML table

Need to create the HTML table from XML Attribute

我有带属性值的输入 XML,需要使用 XSLT 创建 HTML Table。

输入XML:

<manuals>
    <title>Test</title>
    <results>
        <auto name="Data">
            <manual name="Blank">
                <result column="Data"/>
            </manual>
        </auto>
        <auto name="View">
            <manual name="Blank2">
                <result column="Information"/>    
                <result column="Test"/>
            </manual>
            <manual name="Value">
                <result column="Exceptions"/>
            </manual>
        </auto>
    </results>
</manuals>

预期 HTML:

<!DOCTYPE HTML>
<html lang="en">
   <head>
      <title>XXX</title>
      <style>
         table,th, td{border: 1px solid black; padding: 5px;}
      </style>
   </head>
   <body>
      <table>
         <caption>Test</caption>
         <tr>
            <td colspan="2" style="text-align:center">Data</td>
         </tr>
         <tr>
            <td>Blank</td>
            <td>Data</td>
         </tr>
         <tr>
            <td colspan="2" style="text-align:center">View</td>
         </tr>
         <tr>
            <td>Blank2</td>
            <td>
               <ul>
                  <li>Information</li>
                  <li>Test</li>
            </ul>
            </td>
         </tr>
         <tr>
            <td>Value</td>
            <td>Exceptions</td>
         </tr>
         </table>
   </body>
</html>

我试过的XSL是:

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

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

    <xsl:template match="/">
        <html lang="en">
            <head>
                <title>test</title>
                <style>
                    table,th, td{border: 1px solid black; padding: 5px;}
                </style>
            </head>
            <body>
         <table>
             <caption><xsl:value-of select="title"/></caption>
             <xsl:for-each select="auto">
                 <tr>
                     <td colspan="2" style="text-align:center"><xsl:value-of select="@name"/></td>
                     </tr>
             </xsl:for-each>
             <xsl:for-each select="manual">
                 <tr>
                     <td><xsl:value-of select="@name"/></td>
                 </tr>
             </xsl:for-each>
        </table>
            </body>
        </html>
    </xsl:template>

</xsl:stylesheet>

但我无法获得预期的结果。在该输入中,手册中有两个结果,需要放在无序列表中。我正在使用 XSLT 1.0,请推荐任何新版本

当您想 select XSLT 程序中的节点时,您必须提供该节点的绝对或相对路径。例如,当您执行 <xsl:template match="/"> 并且在该模板内部时,您想要 select 标签 <title>,您必须给出它的相对路径,如 <xsl:value-of select="manuals/title"> ,或 <xsl:value-of select="/manuals/title"><xsl:value-of select="//title"> 中的绝对路径,而不仅仅是 <xsl:value-of select="title">.

我还不得不猜测如何使用 <ul>...</ul> 生成无序列表,因为您的代码中没有预见到它。

试试这个 XSLT 代码:

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="html" indent="yes" version="5.0"/>
  <xsl:template match="/">
    <html lang="en">
      <head>
        <title>test</title>
        <style>table,th, td {border: 1px solid black; padding: 5px;}</style>
      </head>
      <body>
        <table>
          <caption>
            <xsl:value-of select="manuals/title"/>
          </caption>
          <xsl:for-each select="manuals/results/auto">
            <tr>
              <td colspan="2" style="text-align:center">
                <xsl:value-of select="@name"/>
              </td>
            </tr>
            <xsl:for-each select="manual">
              <tr>
                <td>
                  <xsl:value-of select="@name"/>
                </td>
                <td>
                  <xsl:choose>
                    <xsl:when test="count (result/@column) = 0">
                      (empty)<!-- you can decide to do something else here -->
                    </xsl:when>
                    <xsl:when test="count (result/@column) = 1">
                      <xsl:value-of select="result/@column"/>
                    </xsl:when>
                    <xsl:otherwise>
                      <ul>
                        <xsl:for-each select="result/@column">
                          <li>
                            <xsl:value-of select="."/>
                         </li>
                        </xsl:for-each>
                      </ul>
                    </xsl:otherwise>
                  </xsl:choose>
                </td>
              </tr>
            </xsl:for-each>
          </xsl:for-each>
        </table>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

下面是我使用 xsltproc 得到的输出,没有缩进我不知道为什么:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>test</title>
<style>table,th, td {border: 1px solid black; padding: 5px;}</style>
</head>
<body><table>
<caption>Test</caption>
<tr><td colspan="2" style="text-align:center">Data</td></tr>
<tr>
<td>Blank</td>
<td>Data</td>
</tr>
<tr><td colspan="2" style="text-align:center">View</td></tr>
<tr>
<td>Blank2</td>
<td><ul>
<li>Information</li>
<li>Test</li>
</ul></td>
</tr>
<tr>
<td>Value</td>
<td>Exceptions</td>
</tr>
</table></body>
</html>