2014-02-23 236 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