Как преобразовать пользовательский XML в таблицу HTML - PullRequest
3 голосов
/ 18 июня 2011

У меня есть файл XML, и я пытаюсь преобразовать его в таблицу (файл HTML. Это мой файл XML:

<?xml version="1.0" encoding="UTF-8"?>
<CONTACTS>
<CONTACT>
    <FirstName>AfgZohal</FirstName>
    <LastName>Zohal Afg</LastName>
    <EMAILS/>
</CONTACT>
<CONTACT>
    <FirstName>Rangarajkarthik</FirstName>
    <LastName>karthik Rangaraj</LastName>
    <EMAILS>
        <EMail>
        <Type>gmail</Type>
        <Value>kart2006@gmail.com</Value>
        </EMail>
        <EMail>
        <Type>yahoo</Type>
        <Value>karthikrangaraj@yahoo.com</Value>
        </EMail>
    </EMAILS>
</CONTACT>
<CONTACT>
    <FirstName>ReganPaul</FirstName>
    <LastName>Paul Michael Regan</LastName>
    <URL>http://www.facebook.com/profile.php?id=1660466705</URL>
    <EMAILS/>
</CONTACT>
<CONTACT>
    <FirstName>keyankarthik</FirstName>
    <LastName>karthik keyan</LastName>
    <EMAILS>
        <EMail>
        <Type>yahoo</Type>
        <Value>karthycse@yahoo.co.in</Value>
        </EMail>
    </EMAILS>
</CONTACT>
<CONTACT>
    <FirstName>ColomboGiorgia</FirstName>
    <LastName>Giorgia Colombo</LastName>
    <EMAILS>
        <EMail>
        <Type>libero</Type>
        <Value>giorgiacolombo89@libero.it</Value>
        </EMail>
    </EMAILS>
</CONTACT>
</CONTACTS>

Это мой файл XSL:

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

<!-- / forward slash is used to denote a patern that matches
the root node of the XML      document -->
<xsl:template match ="/" >
<html>
  <head>
    <title> ContactMatrix</title>
  </head>
  <body>
    <xsl:apply-templates />
  </body>
</html>
</xsl:template>

<xsl:template match="CONTACTS" >
<table width="400" border="1" >
    <tr bgcolor = "#546789" >
        <td>FirstName</td>
        <td>LastName</td>
        <td>Gmail</td>
        <td>Yahoo</td>
        <td>Libero</td>
        <td>URL</td>
    </tr>
<xsl:for-each select="CONTACT" >
    <tr>
        <td> <xsl:value-of select="FirstName"/> </td>
        <td> <xsl:value-of select="LastName"/> </td>

 <!-- here we use /@ to access the value of an attribute -->
        <td> <xsl:value-of select="Type/Value=@gmail.com"/> </td>
        <td> <xsl:value-of select="@yahoo.com"/> </td>
        <td> <xsl:value-of select="@libero.it"/> </td>
        <td> <xsl:value-of select="URL"/> </td>
    </tr>
 </xsl:for-each>
 </table>
</xsl:template >
</xsl:stylesheet >

В моей html-таблице значение для gmail, yahoo, libero = False. Это пример кода в html-файле для FirstName:Rangarajkarthik

<tr>
<td>Rangarajkarthik</td><td>karthik Rangaraj</td><td>false</td><td>false</td><td>false</td><td></td>
</tr>

Пожалуйста, помогите мне.

1 Ответ

3 голосов
/ 18 июня 2011

Вы неправильно выбираете значение элемента для электронных писем.Например, по инструкции:

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

Вы просите выбрать узел с именем @yahoo.com среди дочерних узлов CONTACT.Вы должны использовать:

  <xsl:value-of select="EMAILS/
                EMail[Type='yahoo']/Value"/>

Эта инструкция получает текст Value, потомок EMail, Type которого равен 'yahoo'.Код в атрибуте select - это просто выбор XPath, использующий предикат [..] для соответствия требуемому элементу.Я действительно предлагаю взглянуть на учебный сайт W3C и потратить на него немного времени.

Ваш xsl:for-each подход к созданию таблицы не является неправильным, и вы близки к хорошему решению;однако более XSLT-способ для достижения этой цели - просто использовать xsl:apply-templates в правильном месте.

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

    <xsl:output method="html" indent="yes"/>
    <xsl:strip-space elements="*"/> 

    <xsl:template match="CONTACTS" >
        <html>
            <head>
                <title>ContactMatrix</title>
            </head>
            <body>
                <table width="400" border="1" >
                    <tr bgcolor = "#546789" >
                        <th>FirstName</th>
                        <th>LastName</th>
                        <th>Gmail</th>
                        <th>Yahoo</th>
                        <th>Libero</th>
                        <th>URL</th>
                    </tr>
                    <xsl:apply-templates select="CONTACT"/>
                </table>
            </body>
        </html>
    </xsl:template>

    <xsl:template match="CONTACT">
        <tr>
            <td><xsl:value-of select="FirstName"/> </td>
            <td><xsl:value-of select="LastName"/> </td>
            <td><xsl:value-of select="EMAILS/
                    EMail[Type='gmail']/Value"/>
          </td>
            <td><xsl:value-of select="EMAILS/
                    EMail[Type='yahoo']/Value"/> 
            </td>
            <td><xsl:value-of select="EMAILS/
                    EMail[Type='libero']/Value"/> 
            </td>
            <td><xsl:value-of select="URL"/></td>
        </tr>
    </xsl:template>

</xsl:stylesheet>

При применении к вашему входу выдает:

<html>
   <head>
      <meta http-equiv="Content-Type" content="text/html; charset=utf-8">

      <title>ContactMatrix</title>
   </head>
   <body>
      <table width="400" border="1">
         <tr bgcolor="#546789">
            <th>FirstName</th>
            <th>LastName</th>
            <th>Gmail</th>
            <th>Yahoo</th>
            <th>Libero</th>
            <th>URL</th>
         </tr>
         <tr>
            <td>AfgZohal</td>
            <td>Zohal Afg</td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
         </tr>
         <tr>
            <td>Rangarajkarthik</td>
            <td>karthik Rangaraj</td>
            <td>kart2006@gmail.com</td>
            <td>karthikrangaraj@yahoo.com</td>
            <td></td>
            <td></td>
         </tr>
         <tr>
            <td>ReganPaul</td>
            <td>Paul Michael Regan</td>
            <td></td>
            <td></td>
            <td></td>
            <td>http://www.facebook.com/profile.php?id=1660466705</td>
         </tr>
         <tr>
            <td>keyankarthik</td>
            <td>karthik keyan</td>
            <td></td>
            <td>karthycse@yahoo.co.in</td>
            <td></td>
            <td></td>
         </tr>
         <tr>
            <td>ColomboGiorgia</td>
            <td>Giorgia Colombo</td>
            <td></td>
            <td></td>
            <td>giorgiacolombo89@libero.it</td>
            <td></td>
         </tr>
      </table>
   </body>
</html>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...