2013-08-13 3 views
0

У меня такой xml.XSLT для таблицы XML для HTML

< cars> 
< car> 
< ford color="black" >eco sport</ford>  
< maruti color="red" >zen< /maruti> 
< hyundai color="blue" >accent< /hyundai> 
< /car> 
< car> 
< ford color="green" >figo</ford>  
< maruti color="red" >swift< /maruti> 
< hyundai color="white" >santro< /hyundai> 
< /car> 
< /cars> 

мне нужно иметь таблицу Html как

COMPANY COLOR MODEL 
ford  black ecosport 
maruti red  zen  
hyundai green figo 
ford  red  swift 
maruti red  zen  
hyundai white santro 

Может кто-нибудь помочь мне с этим .. Я новичок в XSLT и провел некоторое время на ценную этого, но не повезло. Заранее спасибо. Ниже это XSLT я пытался с

<xsl:template match ="/"> 
    <html> 
     <head> 
     <title> Cars </title> 
     </head> 
     <body> 
     <xsl:apply-templates /> 
     </body> 
    </html> 
</xsl:template> 

<xsl:template match="cars"> 
    <table width="400" border="1" > 
     <tr bgcolor = "#cccccc" > 
      <td>COMPANY</td> 
      <td>COLOR</td> 
      <td>MODEL</td> 
     </tr> 
<xsl:for-each select="car"> 
     <tr> 
     <xsl:for-each select="./"> 
      <td><xsl:value-of select="name()"/></td>  
      <td> <xsl:value-of select="@color" /> </td> 
       <td> <xsl:value-of select="ford" /> </td> 
     </xsl:for-each> 
     </tr> 
</xsl:for-each> 
    </table> 
</xsl:template> 

ответ

2

Вы имеете несколько (небольшие) проблемы с вами XSLT. Во-первых, эта строка не является действительным

<xsl:for-each select="./"> 

Что вы должны делать в этот момент, как вы расположены на автомобиля элемента, чтобы перебрать каждого дочернего элемента, как и

<xsl:for-each select="*"> 

Во-вторых, вы хотите создать элемент tr в этом цикле, а не снаружи, как вы сейчас делаете. В-третьих, чтобы получить модель, вы делаете это

<xsl:value-of select="ford" /> 

Когда это должно быть именно это

<xsl:value-of select="." /> 

Попробуйте этот XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="/"> 
     <html> 
      <head> 
       <title> Cars </title> 
      </head> 
      <body> 
       <xsl:apply-templates/> 
      </body> 
     </html> 
    </xsl:template> 

    <xsl:template match="cars"> 
     <table width="400" border="1"> 
      <tr bgcolor="#cccccc"> 
       <td>COMPANY</td> 
       <td>COLOR</td> 
       <td>MODEL</td> 
      </tr> 
      <xsl:for-each select="car"> 
       <xsl:for-each select="*"> 
        <tr> 
         <td> 
          <xsl:value-of select="name()"/> 
         </td> 
         <td> 
          <xsl:value-of select="@color"/> 
         </td> 
         <td> 
          <xsl:value-of select="."/> 
         </td> 
        </tr> 
       </xsl:for-each> 
      </xsl:for-each> 
     </table> 
    </xsl:template> 
</xsl:stylesheet> 

Применительно к вашему XML (с пробелами в именах элементов удалены!), выводится следующее:

<html> 
    <head> 
     <title> Cars </title> 
    </head> 
    <body> 
     <table width="400" border="1"> 
      <tr bgcolor="#cccccc"> 
       <td>COMPANY</td> 
       <td>COLOR</td> 
       <td>MODEL</td> 
      </tr> 
      <tr> 
       <td>ford</td> 
       <td>black</td> 
       <td>eco sport</td> 
      </tr> 
      <tr> 
       <td>maruti</td> 
       <td>red</td> 
       <td>zen</td> 
      </tr> 
      <tr> 
       <td>hyundai</td> 
       <td>blue</td> 
       <td>accent</td> 
      </tr> 
      <tr> 
       <td>ford</td> 
       <td>green</td> 
       <td>figo</td> 
      </tr> 
      <tr> 
       <td>maruti</td> 
       <td>red</td> 
       <td>swift</td> 
      </tr> 
      <tr> 
       <td>hyundai</td> 
       <td>white</td> 
       <td>santro</td> 
      </tr> 
     </table> 
    </body> 
</html> 
+0

Большое спасибо. Это абсолютно работает. Еще один вопрос, хотя. Могу ли я иметь отступ до «zen», если элемент равен maruti? –

+0

Итак, вы хотите, чтобы расстояние слева от названия модели было только для maruti zens? – JLRishe

+0

да .. поэтому мое состояние должно быть похоже на «maruti», затем 2 пробела zen nad в следующей строке, если «hyundai», а затем 3 пробела акцентом –

1

У вас его почти не было. Пожалуйста, задайте этот вопрос:

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

    <xsl:template match ="/"> 
    <html> 
     <head> 
     <title> Cars </title> 
     </head> 
     <body> 
     <xsl:apply-templates /> 
     </body> 
    </html> 
    </xsl:template> 

    <xsl:template match="cars"> 
    <table width="400" border="1" > 
     <tr bgcolor = "#cccccc" > 
     <th>COMPANY</th> 
     <th>COLOR</th> 
     <th>MODEL</th> 
     </tr> 
     <xsl:apply-templates /> 
    </table> 
    </xsl:template> 

    <xsl:template match="car/*"> 
    <tr> 
     <td> 
     <xsl:value-of select="name()"/> 
     </td> 
     <td> 
     <xsl:value-of select="@color" /> 
     </td> 
     <td> 
     <xsl:value-of select="." /> 
     </td> 
    </tr> 
    </xsl:template> 
</xsl:stylesheet> 
+0

Большое спасибо. Это абсолютно работает. Еще один вопрос, хотя. Могу ли я иметь отступ до «zen», если элемент равен maruti? –

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