[英]Transform XML with key and value pairs to HTML table
嘗試將 XML 轉換為 HTML 表。 我可以找到很多關於為 XML 創建 XSLT 樣式表的示例,格式如下:
<catalog>
<cd>
<title>Empire Burlesque</title>
<artist>Bob Dylan</artist>
<country>USA</country>
<company>Columbia</company>
</cd>
</catalog>
但是如果格式是這樣的,就像我的數據集中的那樣呢?
<DataObjects>
<ObjectSelect>
<mdNm>my-catalog</mdNm>
<meNm>Catalog Selection A1</meNm>
</ObjectSelect>
<DataInstances>
<DataInstance>
<instanceId>Cd</instanceId>
<field name='title'>Empire Burlesque</field>
<field name='artist'>Bob Dylan</field>
<field name='country'>USA</field>
<field name='company'>Columbia</field>
</DataInstance>
<DataInstance>
<instanceId>Movie</instanceId>
<field name='title'>Casablanca</field>
<field name='director'>Michael Curtiz</field>
<field name='genre'>Drama</field>
</DataInstance>
</DataInstances>
</DataObjects>
每個 InstanceId 都有一個條目,具有唯一的字段名稱,我試圖為每個唯一的 InstanceId 創建一個表 output,所以一個“Cd”表,一個“電影”表,等等。 每個字段將是一個新行,第一列將是 name= 中的內容,值將在該行的第二列中。 我想一旦我弄清楚如何從 name="" 中獲取值並將其作為行名,我就能弄清楚 rest。所有教程都討論使用 value-of,但這只有在以下情況下才有效格式就像給出的第一個例子。
我使用的示例 XSLT 作為起點。 它不喜歡 field name= 格式。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2>Catalog Selection A1</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th>Name</th>
<th>Value</th>
</tr>
<xsl:for-each select="DataObjects/DataInstances/DataInstance/instanceId/Cd">
<tr>
<td>Title</td>
<td><xsl:value-of select="title" /></td>
</tr>
<tr>
<td>Artist</td>
<td><xsl:value-of select="artist" /></td>
</tr>
<tr>
<td>Country</td>
<td><xsl:value-of select="country" /></td>
</tr>
<tr>
<td>Company</td>
<td><xsl:value-of select="company" /></td>
</tr>
</xsl:for-each>
<xsl:for-each select="DataObjects/DataInstances/DataInstance/instanceId/Movie">
<tr>
<td>Title</td>
<td><xsl:value-of select="title" /></td>
</tr>
<tr>
<td>Director</td>
<td><xsl:value-of select="director" /></td>
</tr>
<tr>
<td>Genre</td>
<td><xsl:value-of select="genre" /></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
我要生成的 output 是一個基本的 html 表,如下所示,
<html>
<body>
<h2>Catalog Selection A1</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th>Name</th>
<th>Value</th>
</tr>
<tr>
<td>Title</td>
<td>Empire Burlesque</td>
</tr>
<tr>
<td>Artist</td>
<td>Bob Dylan</td>
</tr>
<tr>
<td>Country</td>
<td>USA</td>
</tr>
<tr>
<td>Company</td>
<td>Columbia</td>
</tr>
</table>
<table border="1">
<tr bgcolor="#9acd32">
<th>Name</th>
<th>Value</th>
</tr>
<tr>
<td>Title</td>
<td>Casablanca</td>
</tr>
<tr>
<td>Director</td>
<td>Michael Curtiz</td>
</tr>
<tr>
<td>Genre</td>
<td>Drama</td>
</tr>
</table>
</body>
</html>
我建議你按照以下方式做一些事情:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/DataObjects">
<html>
<body>
<h2>
<xsl:value-of select="ObjectSelect/meNm" />
</h2>
<h3>Cds</h3>
<xsl:for-each select="DataInstances/DataInstance[instanceId='Cd']">
<xsl:call-template name="table"/>
</xsl:for-each>
<h3>Movies</h3>
<xsl:for-each select="DataInstances/DataInstance[instanceId='Movie']">
<xsl:call-template name="table"/>
</xsl:for-each>
</body>
</html>
</xsl:template>
<xsl:template name="table">
<table border="1">
<tr>
<th>Name</th>
<th>Value</th>
</tr>
<xsl:for-each select="field">
<tr>
<td>
<xsl:value-of select="@name" />
</td>
<td>
<xsl:value-of select="." />
</td>
</tr>
</xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>
這通過 (1) 使用命名模板為任何類型的instanceId
生成表和 (2) 將每個field
處理為具有名稱和值的行來最大限度地減少代碼重復。 然而,這也意味着它將為輸入中的每個field
生成一行。 如果這不是您想要的,則需要做更多的工作。
添加:
如果您只有一種,並且您不介意保留原始訂單,那么您可以簡單地執行以下操作:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/DataObjects">
<html>
<body>
<h2>
<xsl:value-of select="ObjectSelect/meNm" />
</h2>
<xsl:for-each select="DataInstances/DataInstance">
<table border="1">
<tr>
<th>Name</th>
<th>Value</th>
</tr>
<xsl:for-each select="field">
<tr>
<td>
<xsl:value-of select="@name" />
</td>
<td>
<xsl:value-of select="." />
</td>
</tr>
</xsl:for-each>
</table>
</xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.