如何将自定义XML转换为HTML表格

3

我有一个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>

请协助我。

那么,问题是什么?我看不到任何问题。 - Dimitre Novatchev
我已经更改了标题以更好地匹配此问题的内容。如果您关心它,请随时恢复原始标题。 - Emiliano Poggi
这是一个很好的问题,而且提问方式也很恰当。 - user838691
1个回答

3
您没有正确选择电子邮件的元素值。例如,根据以下指示:
<xsl:value-of select="@yahoo.com"/>

您正在寻找在CONTACT的子节点中选择名称为@yahoo.com的节点。您应该使用以下代码:
  <xsl:value-of select="EMAILS/
                EMail[Type='yahoo']/Value"/>

该指令获取EMail子元素中类型为'yahoo'的Value文本内容。在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>

非常感谢您的纠正,这些信息对我来说确实非常有用。我肯定会花一些额外的时间来学习得更好。再次非常感谢您。 - user838691

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接