使用XSLT读取XML空元素<expressionTerm>的expression属性问题咨询
XSLT 读取空元素属性问题解决方案
核心错误排查
你的代码出现空白输出主要有两个原因:
- XPath 大小写敏感导致匹配失败
XPath 对节点名称的大小写严格敏感,你的 XML 中节点名为ruleConditions,但你写的 XPath 路径用了全小写的rulecondition,既少了后缀s,大小写也不匹配,导致完全匹配不到目标节点。 - HTML 表格结构不完整
你在xsl:for-each循环内直接输出<td>单元格标签,缺少外层的<tr>行标签,会导致 HTML 表格渲染异常。
补充说明:空元素不影响属性读取,XSLT 读取元素属性的逻辑和元素是否包含子节点无关,只要属性存在就可以正常获取,不需要额外配置。
修正后的完整 XSLT 代码
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <!-- 输出方法改为html更适配HTML页面输出场景 --> <xsl:output method="html" indent="yes" /> <xsl:template match="/"> <html> <body> <h1 align="center">Basic Details</h1> <table border="3" align="center"> <tr> <th>计算表达式</th> </tr> <!-- 修正节点名称大小写,调整匹配路径 --> <xsl:for-each select="rule/ruleConditions/condition/children/condition/children/expressionTerm"> <tr> <td> <xsl:value-of select="@expression" /> </td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet>
优化方案
如果不需要严格限制节点层级,你可以直接用//expressionTerm全局匹配所有<expressionTerm>节点,避免层级写错的问题,修改后的循环写法如下:
<xsl:for-each select="//expressionTerm"> <tr> <td> <xsl:value-of select="@expression" /> </td> </tr> </xsl:for-each>
该写法无论<expressionTerm>节点嵌套在多少层结构内,都可以正确匹配。
内容的提问来源于stack exchange,提问作者Hari
相关产品推荐
相关产品推荐

