2015-01-03 2 views
1

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

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

Wanted результат:

Employees

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> 

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

enter image description here

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

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

ответ

1

Изменение

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

до

  <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> 
+0

, wow, который работал 99%. Что я пропустил, так как я могу получить имя. Мне нужен еще один вложенный foreach? И как? – developer9969

+0

@ developer9969 Нет, вам не нужен дополнительный 'for-each' - см. Мой ответ для деталей. –

2

Основано на Martin Honnen's answer (примите его ответ).

то, что я пропустил, как получить имя. Мне нужен еще один вложенный 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 Output

<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

enter image description here

+0

@ MathiasMuller.THANKS WORKS !!! – developer9969

Смежные вопросы