Необходимо создать таблицу HTML из атрибута XML - PullRequest
1 голос
/ 08 мая 2020

У меня есть вход XML со значениями атрибутов, необходимо создать таблицу HTML с помощью XSLT.

Вход 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, пожалуйста, предложите любую новую версию

1 Ответ

0 голосов
/ 08 мая 2020

Когда вы хотите выбрать узлы в своей XSLT-программе, вы должны указать абсолютный или относительный путь к этому узлу. Например, когда вы выполняете <xsl:template match="/"> и внутри этого шаблона вы хотите выбрать тег <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 code:

<?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>
...