Хобрук: Ваш путь к мастерству в программировании

преобразование таблицы xml в html не может быть правильным

Новичок в xslt, так что полегче, я пытаюсь преобразовать xml в html через xslt, и, похоже, у меня не получается.

Заголовки и строки не должны быть жестко закодированы и должны быть как можно более общими.

Желаемый результат:

Сотрудники

Используется Xml, над которым я не контролирую

        <?xml version="1.0" encoding="utf-8"?>
    <Generated>
      <Employees>
        <Employee name="Joe Bloggs">
          <Sales>
            <Sale key="Sale-Id" value="333" />
            <Sale key="Sale-Field1" value="a" />
            <Sale key="Sale-Field2" value="b" />
          </Sales>
        </Employee>
        <Employee name="Mark Bloggs">
          <Sales>
            <Sale key="Sale-Id" value="334" />
            <Sale key="Sale-Field1" value="c" />
            <Sale key="Sale-Field2" value="d" />
          </Sales>
        </Employee>
      </Employees>
    </Generated>

XSLT Моя попытка

        <?xml version="1.0" encoding="utf-8"?>
    <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <xsl:output method="html" version="4" encoding="UTF-8" indent="no" omit-xml-declaration="yes"/>
      <!-- main body -->
      <xsl:template match="/">
        <html>
          <body>
            <h3>Employees</h3>
            <table border="1">
              <tr bgcolor="blue">
                <!--Header only so select first row to get headers-->
                <xsl:for-each select="(Generated/Employees/Employee)[1]/Sales/Sale">
                  <th>
                    <xsl:value-of select="@key"/>
                  </th>
                </xsl:for-each>
              </tr>
              <!--Get all the other rows-->
              <xsl:for-each select="(Generated/Employees/Employee)/Sales/Sale">
                <tr>
                  <td>
                    <xsl:value-of select="@value"/>
                  </td>
                </tr>
              </xsl:for-each>
              </table>
          </body>
        </html>
      </xsl:template>
    </xsl:stylesheet>

Мой неправильный результат

введите здесь описание изображения

Любое предложение, как исправить это и получить желаемый результат, как показано на изображении выше.

Большое спасибо

03.01.2015

Ответы:


1

Изменять

          <xsl:for-each select="(Generated/Employees/Employee)/Sales/Sale">
            <tr>
              <td>
                <xsl:value-of select="@value"/>
              </td>
            </tr>
          </xsl:for-each>

to

          <xsl:for-each select="Generated/Employees/Employee">
            <tr>
             <xsl:for-each select="Sales/Sale">
              <td>
                <xsl:value-of select="@value"/>
              </td>
             </xsl:for-each>
            </tr>
          </xsl:for-each>
03.01.2015
  • Вау, это сработало на 99%. Чего мне не хватает, так это того, как мне получить имя. Нужен ли мне еще один вложенный foreach? И как? 03.01.2015
  • @ developer9969 Нет, вам не нужен дополнительный for-each - подробности см. В моем ответе. 03.01.2015

  • 2

    Опираясь на ответ Мартина Хоннена (пожалуйста, примите его ответ).

    что я упускаю, так это то, как мне получить имя. Нужен ли мне еще один вложенный foreach? И как?

    Нет необходимости в дополнительном for-each. Введите еще один td в начале первой строки и назовите его «Имя». Затем внутри for-each для каждого элемента Employee выведите элемент td, содержащий значение @name.

    Таблица стилей XSLT

    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
       <xsl:output method="html" encoding="UTF-8" indent="yes" omit-xml-declaration="yes"></xsl:output>
       <xsl:template match="/">
          <html>
             <body>
                <h3>Employees</h3>
                <table border="1">
                   <tr bgcolor="blue">
                      <td>Name</td>
                      <xsl:for-each select="(Generated/Employees/Employee)[1]/Sales/Sale">
                         <th>
                            <xsl:value-of select="@key"></xsl:value-of>
                         </th>
                      </xsl:for-each>
                   </tr>
                   <xsl:for-each select="Generated/Employees/Employee">
                      <tr>
                         <td>
                            <xsl:value-of select="@name"></xsl:value-of>
                         </td>
                         <xsl:for-each select="Sales/Sale">
                            <td>
                               <xsl:value-of select="@value"></xsl:value-of>
                            </td>
                         </xsl:for-each>
                      </tr>
                   </xsl:for-each>
                </table>
             </body>
          </html>
       </xsl:template>
    </xsl:stylesheet>
    

    Вывод HTML

    <html>
       <body>
          <h3>Employees</h3>
          <table border="1">
             <tr bgcolor="blue">
                <td>Name</td>
                <th>Sale-Id</th>
                <th>Sale-Field1</th>
                <th>Sale-Field2</th>
             </tr>
             <tr>
                <td>Joe Bloggs</td>
                <td>333</td>
                <td>a</td>
                <td>b</td>
             </tr>
             <tr>
                <td>Mark Bloggs</td>
                <td>334</td>
                <td>c</td>
                <td>d</td>
             </tr>
          </table>
       </body>
    </html>
    

    Визуализированный HTML

    введите здесь описание изображения

    03.01.2015
    Новые материалы

    Не зря же это называют интеллектом
    Стек — C#, Oracle Опыт — 4 года Работа — Разведывательный корпус Мне пора служить Может быть, я немного приукрашиваю себя, но там, где я живу, есть обязательная военная служба на 3..

    LeetCode Проблема 41. Первый пропущенный положительный результат
    LeetCode Проблема 41. Первый пропущенный положительный результат Учитывая несортированный массив целых чисел, найдите наименьшее пропущенное положительное целое число. Пример 1: Input:..

    Расистский и сексистский робот, обученный в Интернете
    Его ИИ основан на предвзятых данных, которые создают предрассудки. Он словно переходит из одного эпизода в другой из серии Черное зеркало , а вместо этого представляет собой хронику..

    Управление состоянием в микрофронтендах
    Стратегии бесперебойного сотрудничества Микро-фронтенды — это быстро растущая тенденция в сфере фронтенда, гарантирующая, что удовольствие не ограничивается исключительно бэкэнд-системами..

    Декларативное и функциональное программирование в стиле LINQ с использованием JavaScript с использованием каррирования и генератора ...
    LINQ - одна из лучших функций C #, которая обеспечивает элегантный способ написания кода декларативного и функционального стиля, который легко читать и понимать. Благодаря таким функциям ES6,..

    Структуры данных в C ++ - Часть 1
    Реализация общих структур данных в C ++ C ++ - это расширение языка программирования C, которое поддерживает создание классов, поэтому оно известно как C с классами . Он используется для..

    Как я опубликовал свое первое приложение в App Store в 13 лет
    Как все началось Все началось три года назад летом после моего четвертого класса в начальной школе. Для меня, четвертого класса, лето кажется бесконечным, пока оно не закончится, и мой отец..