2014-02-23 198 views
1

我有一个XML包含这样的数据:将XML转换为表XSLT

<?xml version="1.0" encoding="utf-8"?> 
<dataset xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"> 
    <metadata> 
      <item name="Revenue" type="xs:decimal" scale="2" precision="31"/> 
      <item name="Month" type="xs:short" precision="1"/> 
    </metadata> 
    <data> 
     <row> 
      <value currency="USD">100000</value> 
      <value>1</value> 
     </row> 
     <row> 
      <value currency="USD">200000.16</value> 
      <value>2</value> 
     </row> 
     <row> 
      <value currency="USD">150000.9</value> 
      <value>3</value> 
     </row> 
     <row> 
      <value currency="USD">180000.07</value> 
      <value>4</value> 
     </row> 
    </data> 
</dataset> 

我想这XML转换为HTML表是这样的:

<table border="1"> 
    <tr bgcolor="#9acd32"> 
    <th style="text-align:left">Revenue</th> 
    <th style="text-align:left">Month</th> 
    </tr> 
    <tr> 
    <td>100000</td> 
    <td>1</td> 
    </tr> 
    <tr> 
    <td>200000.16</td> 
    <td>2</td> 
    </tr> 
    <tr> 
    <td>150000.9</td> 
    <td>3</td> 
    </tr> 
    <tr> 
    <td>180000.07</td> 
    <td>4</td> 
    </tr> 
</table> 

任何人都可以请告诉我该怎么做?谢谢。

回答

2

该样式将做到这一点:

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

    <xsl:output method="html"/> 

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

    <xsl:template match="metadata"> 
     <tr bgcolor="#9acd32"> 
      <th style="text-align:left"><xsl:value-of select="item[1]/@name"/></th> 
      <th style="text-align:left"><xsl:value-of select="item[2]/@name"/></th> 
     </tr> 
    </xsl:template> 

    <xsl:template match="row"> 
     <tr><xsl:apply-templates /></tr> 
    </xsl:template> 

    <xsl:template match="value"> 
     <td><xsl:value-of select="."/></td> 
    </xsl:template> 

</xsl:stylesheet> 

这是它如何工作的:

处理器将在模板中读取的每个节点。从根/开始(它有一个隐含的模板),它将处理每个节点,如果有匹配的模板,它将根据模板转换节点。

如果模板中包含<xsl:apply-templates>元素,则该模板可以允许递归处理其他节点。因此处理器找到dataset,将其与第一个模板匹配,添加<table>元素,并在表内将处理器发送到下一个模板。它将处理metadata并完成该子树,然后它将处理data。由于data没有明确的匹配模板,因此它再次使用默认隐式模板,该模板匹配没有显式模板的每个可到达节点。该模板允许处理树的其余部分,即row,其中包含apply-templatesvalue

模板被处理多次以呈现生成的HTML。

+0

非常好的解释,谢谢! – eric2323223

+0

我试过你的代码,但为什么所有的标签都不见了? – eric2323223

+0

如果您尝试使用您发布的源XML的代码,它会生成您期望的内容。如果它不起作用,或许你的来源有变化。在这种情况下,您需要对其进行调整,因为XSL取决于源结构。 – helderdarocha