XSL样式表生成HTML表格仅显表头,无XML数据如何解决?
这种只出表头没数据的情况我在做XSLT转换时碰到过好多次,大概率是这几个常见问题导致的,咱们一步步来排查:
命名空间遗漏(最容易踩的坑)
如果你的XML文件里定义了默认命名空间(比如xmlns="http://your-domain.com"),那XSLT里必须先声明这个命名空间,并且在所有XPath选择器里加上对应的前缀,否则XSLT会找不到任何节点。
举个例子:
假设你的XML是:<inventory xmlns="http://example.com/inventory"> <item> <product>Laptop</product> <price>999</price> </item> </inventory>那你的XSLT必须这样写:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:inv="http://example.com/inventory"> <!-- 绑定命名空间 --> <xsl:output method="html" doctype-system="about:legacy-compat"/> <xsl:template match="/"> <html> <body> <table border="1"> <tr><th>Product</th><th>Price</th></tr> <!-- 用前缀inv:选择节点 --> <xsl:for-each select="inv:inventory/inv:item"> <tr> <td><xsl:value-of select="inv:product"/></td> <td><xsl:value-of select="inv:price"/></td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet>XPath路径错误
你得先确认XML的层级结构,确保xsl:for-each和xsl:value-of的路径完全对应。比如如果你的XML根节点是<data>,里面包含<products>列表,那for-each的路径应该是/data/products/product,而不是直接写product(除非你的模板已经匹配了/data/products节点)。
举个错误示例:
如果XML是:<data> <products> <product><name>Mouse</name></product> </products> </data>错误的XPath:
<xsl:for-each select="product">(直接找product,找不到,因为它在data/products下面)
正确的XPath:<xsl:for-each select="/data/products/product">模板匹配不正确
从你给出的代码片段看,xsl:template的内容没写完,要确保你的主模板是匹配根节点的,也就是match="/"。如果模板匹配的是某个不存在的节点,那整个转换逻辑根本不会执行,自然只会输出你手动写的表头。
正确的模板开头应该是:<xsl:template match="/"> <!-- 这里写你的HTML结构和循环逻辑 --> </xsl:template>浏览器调试辅助
打开浏览器的开发者工具(按F12),切换到控制台(Console)标签,看看有没有XML/XSL相关的错误提示。浏览器通常会告诉你哪个XPath表达式无效,或者找不到对应的节点,这能帮你快速定位问题。
内容的提问来源于stack exchange,提问作者Manny0

