如何遍历多XML文件并将关联属性值写入HTML表格行?
问题分析与解决方案
看起来你在处理多XML文件生成HTML表格时,主要问题在于没有正确关联当前review的rid和对应的date属性,同时代码里还有一些变量赋值和结构上的小问题。咱们一步步来修正:
核心问题点
$currentRid变量赋值错误:你在遍历distinct-values($files/review/@rid)时,内部又重新取了所有rid的去重值,这会导致变量指向所有rid,而不是当前循环的那个特定rid。- Date值获取逻辑错误:你遍历了所有review的date去重值,这会把所有日期都输出到同一个单元格,而不是当前review对应的日期。
$currentPid的冗余与不明确:每个review下有多个<pc>节点,但你的期望输出是每个review对应一行表格,需要明确指定取哪个pc的result(比如固定取pc_001,或者处理所有pc?这里按你的示例输出默认取固定pid的)。- HTML结构错误:原代码里
</xsl:if>后面多了一个</tr>,会破坏表格的闭合结构。
修正后的XSLT代码
<xsl:variable name="files" select="collection('../?select=*.xml')"/> <xsl:template match="/"> <!-- @pid value outside the table as header. --> <table> <tr> <td>Review ID</td> <td>Date</td> <td>Result</td> </tr> <xsl:if test="$files"> <!-- 直接遍历每个review节点,避免关联错误 --> <xsl:for-each select="$files/review"> <tr> <td> <!-- 提取rid中的数字部分,比如把id_001转为001 --> <xsl:value-of select="substring-after(@rid, 'id_')"/> </td> <td> <!-- 直接获取当前review的date属性 --> <xsl:value-of select="@date"/> </td> <td> <!-- 这里指定取pid为pc_001的result,可根据需求修改 --> <xsl:value-of select="pc[@pid='pc_001']/result"/> </td> </tr> </xsl:for-each> </xsl:if> </table> </xsl:template>
关键修改说明
- 遍历对象调整:直接遍历
$files/review而非distinct-values($files/review/@rid),这样每个循环都对应一个完整的<review>节点,能直接获取它的所有属性和子节点,彻底避免关联错误。 - Date值正确获取:现在直接用
@date就能拿到当前review的日期,不需要额外循环。 - Review ID格式化:用
substring-after(@rid, 'id_')把id_001转换成你期望的001,如果不需要格式化,直接用@rid即可。 - Result节点指定:明确指定取
pc[@pid='pc_001']/result,如果需要显示多个pc的结果,可以改成循环遍历<pc>节点,或者用string-join把多个结果拼接成字符串。 - 修复结构错误:移除了多余的
</tr>,保证HTML表格结构完全正确。
验证输出
用你提供的两个XML文件作为输入,运行修正后的XSLT,会生成完全符合你期望的HTML表格:
<!-- @pid value outside the table as header. --> <table> <tr> <td>Review ID</td> <td>Date</td> <td>Result</td> </tr> <tr> <td>001</td> <td>2018-03-20</td> <td>...</td> </tr> <tr> <td>002</td> <td>2018-05-19</td> <td>...</td> </tr> </table>
内容的提问来源于stack exchange,提问作者Aguanile
相关产品推荐
相关产品推荐

