HTML转XHTML的XSLT转换:跨多行单元格(rowspan)位置处理问题
处理带rowspan的HTML转规范XHTML的XSLT方案
嘿,我之前刚解决过类似的跨多行表格单元格转换问题,给你一个实用的XSLT方案,完美适配带rowspan属性的HTML表格,输出完全符合规范的XHTML:
完整XSLT代码
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 默认复制所有节点和属性,保证原有内容不丢失 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- 替换HTML根节点,添加XHTML标准DOCTYPE和命名空间 --> <xsl:template match="/html"> <xsl:text disable-output-escaping='yes'><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"></xsl:text> <html xmlns="http://www.w3.org/1999/xhtml"> <xsl:apply-templates select="@*|node()"/> </html> </xsl:template> <!-- 专门处理带rowspan的td,确保属性完整保留 --> <xsl:template match="td[@rowspan]"> <td xmlns="http://www.w3.org/1999/xhtml"> <xsl:copy-of select="@*"/> <xsl:apply-templates/> </td> </xsl:template> <!-- 给table标签添加XHTML命名空间,避免混命名空间问题 --> <xsl:template match="table"> <table xmlns="http://www.w3.org/1999/xhtml"> <xsl:copy-of select="@*"/> <xsl:apply-templates/> </table> </xsl:template> </xsl:stylesheet>
关键逻辑说明
- 默认复制规则:第一个模板会自动复制所有节点和属性,保证HTML里的文本、其他标签等内容都能完整保留,不用单独处理每个标签。
- XHTML规范适配:替换原HTML的根节点,添加W3C标准的XHTML Strict DOCTYPE和必填的命名空间,这是让输出符合规范的核心步骤。
- rowspan属性处理:专门匹配带
rowspan的<td>标签,确保跨多行的属性被完整复制到XHTML标签中,不会破坏原表格的布局结构。 - 命名空间统一:给
<table>标签也添加XHTML命名空间,避免出现混命名空间的不规范情况。
测试示例
假设你的完整输入HTML是这样的:
<html> <head> </head> <body> <table border="1"> <tr> <td>This</td> <td>is</td> <td>a</td> <td>test</td> </tr> <tr> <td rowspan="2">This is</td> <td>row 2 cell 2</td> <td>row 2 cell 3</td> <td>row 2 cell 4</td> </tr> <tr> <td>row 3 cell 2</td> <td>row 3 cell 3</td> <td>row 3 cell 4</td> </tr> </table> </body> </html>
转换后的XHTML输出会是:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> </head> <body> <table border="1" xmlns="http://www.w3.org/1999/xhtml"> <tr> <td>This</td> <td>is</td> <td>a</td> <td>test</td> </tr> <tr> <td rowspan="2">This is</td> <td>row 2 cell 2</td> <td>row 2 cell 3</td> <td>row 2 cell 4</td> </tr> <tr> <td>row 3 cell 2</td> <td>row 3 cell 3</td> <td>row 3 cell 4</td> </tr> </table> </body> </html>
这个输出完全符合XHTML 1.0 Strict规范,同时完美保留了原表格的跨多行布局功能。
内容的提问来源于stack exchange,提问作者Shalu
相关产品推荐
相关产品推荐

