2012-05-15 2 views
-3

У меня сложный XML, и я пытаюсь написать преобразование XSL, чтобы преобразовать его в HTML. Может кто-нибудь, пожалуйста, помогите мне с этим?XSL-преобразование сложного XML

Вот XML

<?xml version="1.0" encoding="iso-8859-1"?> 
<?xml-stylesheet type="text/xsl" href="Mbooks.xsl"?> 
<project> 
    <books> 
    <bookName>Eclpise</bookName> 
    <bookCount>3</bookCount> 
    <Data> 
     <NEW> 
     <bookNumber>book3687110</bookNumber> 
     <ISBN>927fd6ca660e5a9</ISBN> 
     <Isbninfo> 
      <IsbninfoDetails> 
      <IsbninfoName>new book</IsbninfoName> 
      <IsbninfoVersion>version 1</IsbninfoVersion> 
      </IsbninfoDetails> 
      <IsbninfoDetails> 
      <IsbninfoName> new book 1</IsbninfoName> 
      <IsbninfoVersion>version 2</IsbninfoVersion> 
      </IsbninfoDetails> 
     </Isbninfo> 
     </NEW> 
     <NEW> 
     <bookNumber>book3674796</bookNumber> 
     <ISBN>6fa276825144</ISBN> 
     <Isbninfo> 
      <IsbninfoDetails> 
      <IsbninfoName>new book 3</IsbninfoName> 
      <IsbninfoVersion>version 3</IsbninfoVersion> 
      </IsbninfoDetails> 
      <IsbninfoDetails> 
      <IsbninfoName>new book 4</IsbninfoName> 
      <IsbninfoVersion>version 4</IsbninfoVersion> 
      </IsbninfoDetails> 
     </Isbninfo> 
     </NEW> 
    </Data> 
    </books> 
    <books> 
    <bookName>ORACLE</bookName> 
    <bookCount>0</bookCount> 
    <Data> 
    </Data> 
    </books> 
    <books> 
    <bookName>MUSIC</bookName> 
    <bookCount>0</bookCount> 
    <Data> 

    </Data> 
    </books> 
</project> 

Вот XSLT.

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:template match="/"> 
    <html> 
     <body> 
     <h2>BOOK_INFORMATION </h2> 
     <table style="display: inline-block; border: 1px solid; float: left; "> 
      <tr bgcolor="#FFA500"> 
      <th>book Name</th> 
      <th>book_Count</th> 
      <th>book_Number</th> 
      <th>ISBN</th> 
      <th>Isbninfo_Name</th> 
      <th>Isbninfo_Version</th> 
      </tr> 

      <xsl:for-each select="project/books"> 
      <tr> 
       <td> 
       <xsl:value-of select="bookName"/> 
       </td> 
       <td> 
       <xsl:value-of select="bookCount"/> 
       </td> 
      </tr> 
      </xsl:for-each> 

     </table> 

     </body> 
    </html> 
    </xsl:template> 

</xsl:stylesheet> 

Я не знаю, как бы я получить другую информацию: Я хочу, чтобы все это в одной таблице. Я пробовал делать <xsl:for-each> внутри каждого, но он не работает.

ответ

0

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

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

    <xsl:template match="text()"> 
    </xsl:template> 

    <xsl:template match="IsbninfoDetails"> 
    <tr> 
     <td> 
     <xsl:value-of select="../../../../bookName"/> 
     </td> 
     <td> 
     <xsl:value-of select="../../../../bookCount"/> 
     </td> 
     <td> 
     <xsl:value-of select="../../bookNumber"/> 
     </td> 
     <td> 
     <xsl:value-of select="../../ISBN"/> 
     </td> 
     <td> 
     <xsl:value-of select="IsbninfoName"/> 
     </td> 
     <td> 
     <xsl:value-of select="IsbninfoVersion"/> 
     </td> 
    </tr> 
    </xsl:template> 

    <xsl:template match="books[not(Data/NEW)]"> 
    <tr> 
     <td> 
     <xsl:value-of select="bookName"/> 
     </td> 
     <td> 
     <xsl:value-of select="bookCount"/> 
     </td> 
    </tr> 
    </xsl:template> 

    <xsl:template match="NEW[not(Isbninfo/IsbninfoDetails)]"> 
    <tr> 
     <td> 
     <xsl:value-of select="../../bookName"/> 
     </td> 
     <td> 
     <xsl:value-of select="../../bookCount"/> 
     </td> 
     <td> 
     <xsl:value-of select="bookNumber"/> 
     </td> 
     <td> 
     <xsl:value-of select="ISBN"/> 
     </td> 
    </tr> 
    </xsl:template> 

    <xsl:template match="/"> 
    <html> 
     <body> 
     <h2>BOOK_INFORMATION </h2> 
     <table style="display: inline-block; border: 1px solid; float: left; "> 
      <tr bgcolor="#FFA500"> 
      <th>book Name</th> 
      <th>book_Count</th> 
      <th>book_Number</th> 
      <th>ISBN</th> 
      <th>Isbninfo_Name</th> 
      <th>Isbninfo_Version</th> 
      </tr> 
      <xsl:apply-templates/> 
     </table> 

     </body> 
    </html> 
    </xsl:template> 

</xsl:stylesheet> 

применен к примеру производит это:

<html> 
    <body> 
    <h2>BOOK_INFORMATION </h2> 
    <table style="display: inline-block; border: 1px solid; float: left; "> 
     <tr bgcolor="#FFA500"> 
     <th>book Name</th> 
     <th>book_Count</th> 
     <th>book_Number</th> 
     <th>ISBN</th> 
     <th>Isbninfo_Name</th> 
     <th>Isbninfo_Version</th> 
     </tr> 
     <tr> 
     <td>Eclpise</td> 
     <td>3</td> 
     <td>book3687110</td> 
     <td>927fd6ca660e5a9</td> 
     <td>new book</td> 
     <td>version 1</td> 
     </tr> 
     <tr> 
     <td>Eclpise</td> 
     <td>3</td> 
     <td>book3687110</td> 
     <td>927fd6ca660e5a9</td> 
     <td> new book 1</td> 
     <td>version 2</td> 
     </tr> 
     <tr> 
     <td>Eclpise</td> 
     <td>3</td> 
     <td>book3674796</td> 
     <td>6fa276825144</td> 
     <td>new book 3</td> 
     <td>version 3</td> 
     </tr> 
     <tr> 
     <td>Eclpise</td> 
     <td>3</td> 
     <td>book3674796</td> 
     <td>6fa276825144</td> 
     <td>new book 4</td> 
     <td>version 4</td> 
     </tr> 
     <tr> 
     <td>ORACLE</td> 
     <td>0</td> 
     </tr> 
     <tr> 
     <td>MUSIC</td> 
     <td>0</td> 
     </tr> 
    </table> 
    </body> 
</html> 

Идея заключается в том, чтобы иметь различные шаблоны, которые соответствуют различному возможному уровню детализации, найденной в XML - каждая шаблон, генерирующий строку таблицы с более или менее ячейками.

+0

эй спасибо за Ваш ответ, но это возможно, чтобы не дублировать название книги, book_count, BOOK_NUMBER и номер ISBN и мы можем добавить что-то вроде диапазона строк или так и сделать его похожим на одну соответствующую таблицу? Спасибо за помощь. – Maxyie

+0

Да, это конечно возможно, но вы должны указать бит lttle лучше, что именно вы хотите - и то, что вы пробовали. – MiMo

+0

Эй, извините за путаницу, что у меня есть причина. Мне нужна правильная таблица, в которой нужные поля не дублируются. Я пытаюсь использовать цикл foreach внутри цикла foreach, но я думаю, что он не работает так, как работает java или perl. Я добавил «пример html» в новый поток, так как я не могу его записать здесь – Maxyie

-1
<html> 
<body>  
<h2>BOOK_INFORMATION </h2> 
    <table style="display: inline-block; border: 1px solid;  float: left; ">  
<tr bgcolor="#FFA500">   
<th>book Name</th>  
<th>book_Count</th>  
<th>book_Number</th>  
<th>ISBN</th>   
<th>Isbninfo_Name</th>  
<th>Isbninfo_Version</th> 
</tr>  
<tr>  
<td rowspan ="4">Eclpise</td>  
<td rowspan ="4">3</td>  
<td rowspan = "2">book3687110</td> 
    <td rowspan = "2">927fd6ca660e5a9</td>   
<td>new book</td> 
<td>version 1</td> 
</tr> 
<tr> 
<td>new book1</td> 
<td>version 2</td> 
</tr> 
<tr> 
<td rowspan ="2">book3674796</td>  
<td rowspan ="2">6fa276825144</td> 
<td>new book2</td> 
<td>version 3</td> 
</tr> 
<tr> 
<td>new book3</td> 
<td>version 4</td> 
</tr>  
<tr>  
<td>ORACLE</td> 
<td>0</td> 
</tr>  
<tr>  
<td>MUSIC</td> 
<td>0</td>  
</tr> 
</table> 
</body> 
</html> 
Смежные вопросы