如何使用XSL将XML转换为HTML?

时间:2014-06-24 10:09:22

标签: html xml xslt

我需要使用XSLTProcessor将xml文档转换为html。

我的xml文档是:

<?xml version="1.0" encoding="utf-8"?>
<items>
    <item>
        <property title="title1"><![CDATA[data1]]></property>
        <property title="title2"><![CDATA[data3]]></property>
        <property title="title3"><![CDATA[data3]]></property>
        </item>
        <item>
        <property title="title4"><![CDATA[data4]]></property>
        <property title="title5"><![CDATA[data5]]></property>
        <property title="title6"><![CDATA[data6]]></property>
        </item>
</items>

我必须得到的是:

<html>
    <table border="1">
        <tr bgcolor="#eee"><td colspan="2">title1: data1</td></tr>
                <tr><td> title2</td> <td>data2</td></tr>
        <tr><td> title3</td> <td>data3</td></tr> 

        <tr bgcolor="#eee"><td colspan="2">title4: data4</td></tr>
                <tr><td> title5</td> <td>data5</td></tr>
        <tr><td> title6</td> <td>data6</td></tr>


    </table>
</html>

我的xsl文件现在是:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:php="http://php.net/xsl"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="html" encoding="UTF-8" indent="yes"/>

    <xsl:template match="/">
    <html>
        <xsl:apply-templates select="items"/>
    </html>
    </xsl:template>

    <xsl:template match="items">
    <table border="1">
        <xsl:apply-templates select="item"/>
        </table>
    </xsl:template>

    <xsl:template match="item">

    <tr bgcolor="#eee"> <td colspan="2">
        <xsl:value-of select="/descendant::*/@*"/>:
        <xsl:value-of select="property"/>
        </td> </tr>

    </xsl:template>
</xsl:stylesheet>

但它只返回第一个标签&#34;属性&#34;。我是xslt的新手,我有什么办法来获取&#34;属性&#34;标记

2 个答案:

答案 0 :(得分:1)

您在开始时使用了模板,只需继续执行此操作,编写模板并应用它们:

<xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="html" encoding="UTF-8" indent="yes"/>

    <xsl:template match="/">
    <html>
        <xsl:apply-templates select="items"/>
    </html>
    </xsl:template>

    <xsl:template match="items">
    <table border="1">
        <xsl:apply-templates/>
        </table>
    </xsl:template>

    <xsl:template match="item/property[1]">

    <tr bgcolor="#eee"> <td colspan="2">
        <xsl:value-of select="@title"/>:
        <xsl:value-of select="."/>
        </td> </tr>

    </xsl:template>

    <xsl:template match="item/property[not(position() = 1)]">
      <tr>
        <td><xsl:value-of select="@title"/></td>
        <td><xsl:value-of select="."/></td>
      </tr>
    </xsl:template>
</xsl:stylesheet>

答案 1 :(得分:0)

您需要使用for-each声明

<xsl:template match="item">
  <xsl:for-each select = "property">
    <tr bgcolor="#eee"> 
      <td colspan="2">
        <xsl:value-of select="/descendant-or-self::*/@*"/>:
        <xsl:value-of select="."/>
      </td> 
    </tr>
  </xsl:for-each>
</xsl:template>

我还将您的descendant更改为descendant-or-self,使其完全等同于之前的版本。