2015-11-04 66 views
0

我有以下的html:更改HTML動態通XSL

<!DOCTYPE html> 
<html> 
<head> 
<style> 
table, th, td { 
    border: 1px solid black; 
    border-collapse: collapse; 
} 
th, td { 
    padding: 5px; 
} 
</style> 
</head> 
<body> 

<table style="width:100%"> 
    <tr> 
    <th>Name</th> 
    <th>City</th> 
    <th>State</th> 
    <th>Zip</th>   
    </tr> 
    <tr> 
    <td> [lastName],[firstName] </td> 
    <td>[City]</td> 
    <td>[State]</td> 
    <td>[Zip]</td> 
    </tr> 
</table> 

</body> 
</html> 

我會從一個XML獲取值

<person> 
    <lastName>Zones</lastName> 
    <firstName>Adam</firstName> 
    <City>Columbus</City> 
    <State>OH</State> 
    <Zip>44250</Zip> 
</person> 

我想表中的數據<td>元素動態地更換值:

<td>Zones, Adam</td> 
<td>columbus</td> 
<td>OH</td> 
<td>44250</td> 

如何實現這一點,需要更改名稱,城市,州,與用戶條目拉鍊。

+0

XSL不起作用這樣的,它有沒有任何與你有那裏的HTML特定的語法。 –

+1

那麼通常的做法是讓XSLT處理XML輸入和有創建HTML模板,在模板中,你會再使用XSLT語法像'的​​的 ...'。如果您正在使用自己編寫的模板語法,那麼您可能需要實現自己的編程語言來處理模板。 –

回答

0

這是相當繁瑣的XSLT 1.0做的,但當然是可能的:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" omit-xml-declaration="yes" version="1.0" encoding="utf-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:param name="lookup-doc-path" select="'person.xml'"/> 

<xsl:key name="elem-by-name" match="*" use="name()" /> 

<!-- identity transform --> 
<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="td"> 
    <xsl:copy> 
     <xsl:call-template name="merge"> 
      <xsl:with-param name="string" select="."/> 
     </xsl:call-template> 
    </xsl:copy> 
</xsl:template> 

<xsl:template name="merge"> 
    <xsl:param name="string"/> 
    <xsl:choose> 
     <xsl:when test="contains($string, '[') and contains(substring-after($string, '['), ']')"> 
      <xsl:value-of select="substring-before($string, '[')" /> 
      <!-- lookup --> 
      <xsl:variable name="placeholder" select="substring-before(substring-after($string, '['), ']')" /> 
      <xsl:for-each select="document($lookup-doc-path)"> 
       <xsl:value-of select="key('elem-by-name', $placeholder)" /> 
      </xsl:for-each> 
      <!-- recursive call --> 
      <xsl:call-template name="merge"> 
       <xsl:with-param name="string" select="substring-after(substring-after($string, '['), ']')" /> 
      </xsl:call-template> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:value-of select="$string" /> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

</xsl:stylesheet> 

這是假設你是指揮你的XSLT處理器來處理HTML文件(也必須是一個良好的XML文檔! )並將包含實際值的XML文檔的路徑作爲參數提供。

這是否有到位的最佳工作流程是另外一個問題。