如何用XSLT将含键值对属性的XML转换为HTML表格?
自定义XML转分组HTML表格的XSLT方案
原始XML结构
你的数据集采用如下格式,每个DataInstance对应一条数据,通过instanceId区分类型,字段通过带name属性的field元素定义:
<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>
现有XSLT的问题
你提供的初始XSLT采用硬编码字段的方式,无法动态提取field元素的name属性作为行标题,也无法为每个instanceId生成独立的HTML表格。
期望HTML输出
需要为每个instanceId生成独立表格,每行第一列为字段名,第二列为字段值:
<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
以下XSLT可以实现动态转换,无需硬编码字段:
<?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><xsl:value-of select="DataObjects/ObjectSelect/meNm"/></h2> <!-- 遍历每个DataInstance,生成独立表格 --> <xsl:for-each select="DataObjects/DataInstances/DataInstance"> <table border="1"> <tr bgcolor="#9acd32"> <th>Name</th> <th>Value</th> </tr> <!-- 遍历当前实例下的所有field元素 --> <xsl:for-each select="field"> <tr> <!-- 提取field的name属性并将首字母大写 --> <td> <xsl:value-of select="concat(translate(substring(@name,1,1),'abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLMNOPQRSTUVWXYZ'), substring(@name,2))"/> </td> <!-- 提取field的文本内容 --> <td><xsl:value-of select="."/></td> </tr> </xsl:for-each> </table> </xsl:for-each> </body> </html> </xsl:template> </xsl:stylesheet>
关键说明
- 动态遍历实例:通过
xsl:for-each遍历每个DataInstance,自动为每条数据生成独立表格 - 动态提取字段名:使用
@name获取field的属性值,通过字符串处理实现首字母大写,匹配期望的输出格式 - 动态提取字段值:使用
.直接获取field元素的文本内容 - 自适应标题:从
ObjectSelect/meNm自动读取页面标题,无需硬编码
内容的提问来源于stack exchange,提问作者Danny Z
相关产品推荐
相关产品推荐

