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

时间:2011-06-18 13:02:28

标签: html xml xslt

我有一个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的值。 这是FirstName:Rangarajkarthik

的html文件中的示例代码
<tr>
<td>Rangarajkarthik</td><td>karthik Rangaraj</td><td>false</td><td>false</td><td>false</td><td></td>
</tr>

请帮助我。

1 个答案:

答案 0 :(得分:3)

您没有正确选择电子邮件的元素值。例如,通过指令:

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

您要求在@yahoo.com的子节点中选择名称为CONTACT的节点。你应该使用:

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

此指令获取Value的文字,EMail的{​​{1}}为'yahoo'的孩子。 Type属性中的代码只是一个XPath选择,使用谓词select来匹配所需元素。我真的建议看一下W3C教程网站,花一些时间。

您构建表格的[..]方法并没有错,而且您接近一个好的解决方案;但是,更多XSLT方法可以在正确的位置使用xsl:for-each

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>