XSLT解析HTML表格:仅选tbody下顶级tr生成标签页
解决XSLT标签页生成错误及部署问题
一、修正标签页与卡片的选择逻辑
你的核心问题是未明确区分**<tbody>的直接子<tr>(顶级标签行)和顶级<tr>内部的嵌套<tr>(卡片行)**,导致所有<tr>都被识别为标签页。通过精准的节点路径选择即可修复:
1. 生成标签页导航(仅选顶级<tr>)
使用tbody/tr选择<tbody>的直接子元素<tr>(即带heading类的顶级行),避免使用//tr这类全局选择器:
<!-- 标签页导航栏 --> <div class="tab-navigation"> <xsl:for-each select="tbody/tr"> <!-- 用position()生成唯一标签页ID --> <button class="tab-item" data-target="tab-<xsl:value-of select='position()'/>"> <xsl:value-of select="td[@class='heading']"/> </button> </xsl:for-each> </div>
2. 生成对应标签页的卡片内容(遍历顶级<tr>内部的嵌套<tr>)
在遍历顶级<tr>的循环内,用tr选择当前顶级<tr>下的直接子<tr>(卡片行):
<!-- 标签页内容容器 --> <div class="tab-contents"> <xsl:for-each select="tbody/tr"> <div class="tab-content" id="tab-<xsl:value-of select='position()'/>"> <div class="card-container"> <!-- 遍历当前顶级tr下的所有嵌套tr,生成卡片 --> <xsl:for-each select="tr"> <div class="card"> <!-- 根据需求处理卡片内的td内容,示例如下 --> <xsl:for-each select="td"> <div class="card-field"> <xsl:value-of select="."/> </div> </xsl:for-each> </div> </xsl:for-each> </div> </div> </xsl:for-each> </div>
二、部署后异常的排查方案
本地正常但部署后出错,通常是环境差异导致,按以下顺序排查:
- XSLT版本兼容:本地可能使用了XSLT 2.0/3.0特性(如
for-each-group、matches()正则),但服务器仅支持1.0。检查代码,将高版本特性替换为1.0兼容写法,比如用xsl:key分组替代for-each-group。 - 命名空间问题:如果原XML包含命名空间(如
<html:tbody>),本地测试可能忽略了命名空间绑定,但服务器处理器严格要求。在XSLT根元素xsl:stylesheet中添加命名空间声明,比如xmlns:html="http://www.w3.org/1999/xhtml",并在节点选择时加上前缀:html:tbody/html:tr。 - 节点匹配精度:服务器上的XML可能存在细微差异,比如
class属性带空格(class=' heading ')或大小写不一致(Heading)。修改匹配逻辑为normalize-space(td/@class)='heading',或者用translate(td/@class,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')='heading'忽略大小写。 - 处理器差异:本地用Saxon,服务器用libxslt或Xalan,部分语法支持不同。比如libxslt对
position()在嵌套循环中的处理、xsl:output的参数可能有差异,需测试目标处理器的兼容性。 - 编码与权限:检查服务器上XML/XSLT文件的编码是否为UTF-8(在XSLT中添加
<xsl:output encoding="UTF-8"/>强制输出编码);同时确认服务器进程有读取这两个文件的权限,文件路径是否正确(避免相对路径导致找不到文件)。
内容的提问来源于stack exchange,提问作者tahdhaze09
相关产品推荐
相关产品推荐

