XSLT无法从XML生成多HTML文件:仅生成主列表文件问题
解决XSLT无法生成单个车辆HTML文件的问题
你遇到的核心问题是:负责生成单个车辆详情页的popisky模式模板完全没有被触发执行。你的主处理流程只调用了生成主列表的hlavniSeznam模式,根本没去调用生成单个文件的逻辑,自然不会产出auto{generate-id()}.html这类文件。
下面是修复后的完整XSLT代码:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:au="http://example.com/autobazar" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs au" version="2.0"> <xsl:output method="html" encoding="UTF-8"/> <xsl:output method="html" encoding="UTF-8" name="html"/> <!-- 主入口模板:同时触发主列表生成和单个车辆文件生成 --> <xsl:template match="/"> <!-- 生成主HTML文件 --> <xsl:text disable-output-escaping="yes"> &lt;!DOCTYPE html&gt; </xsl:text> <html lang="cs"> <head> <title>Autobazar</title> </head> <body> <xsl:apply-templates mode="hlavniSeznam"/> </body> </html> <!-- 触发单个车辆详情页的生成 --> <xsl:apply-templates select="//au:auto" mode="popisky"/> </xsl:template> <xsl:template match="au:autobazar" mode="hlavniSeznam"> <h1>Autobazar</h1> <ul> <xsl:apply-templates select="au:auto" mode="hlavniSeznam"/> </ul> </xsl:template> <xsl:template match="au:auto" mode="hlavniSeznam"> <li> <a href="auto{generate-id()}.html"> <xsl:value-of select="au:znacka"/> - <xsl:value-of select="au:model"/> </a> </li> </xsl:template> <!-- 修改后的单个车辆模板:去掉多余的for-each,直接匹配单个au:auto元素 --> <xsl:template match="au:auto" mode="popisky"> <xsl:result-document href="auto{generate-id()}.html"> <xsl:text disable-output-escaping="yes"> &lt;!DOCTYPE html&gt; </xsl:text> <html> <head> <title> <xsl:value-of select="au:znacka"/> <xsl:value-of select="au:model"/> </title> </head> <body> <h1> <xsl:value-of select="au:znacka"/> <xsl:value-of select="au:model"/> </h1> <!-- 可扩展:添加更多车辆详情字段 --> <p>VIN: <xsl:value-of select="@vin"/></p> <p>Cena: <xsl:value-of select="au:cena"/> <xsl:value-of select="au:cena/@jednotka"/></p> <p>Najeto: <xsl:value-of select="au:najeto"/> <xsl:value-of select="au:najeto/@jednotka"/></p> </body> </html> </xsl:result-document> </xsl:template> </xsl:stylesheet>
关键修改点说明:
- 触发单个文件生成逻辑:在主模板(匹配
/的模板)末尾添加了<xsl:apply-templates select="//au:auto" mode="popisky"/>,这样才会遍历所有au:auto元素并调用popisky模式的模板,从而触发xsl:result-document生成单个文件。 - 简化
popisky模板逻辑:移除了原模板里的xsl:for-each select="//au:autobazar/au:auto",因为现在是通过主模板的apply-templates来遍历每个au:auto,模板直接匹配单个元素即可,这更符合XSLT的模板匹配设计思想,也避免了不必要的重复遍历。 - 可选扩展:在修复后的模板里添加了VIN、价格、行驶里程等内容,你可以根据需求继续扩展更多车辆字段。
验证效果:
使用支持XSLT 2.0的处理器(比如Saxon)运行修改后的XSLT,会生成:
- 包含车辆链接列表的主HTML文件
- 两个对应单辆车的
auto[生成ID].html详情文件
内容的提问来源于stack exchange,提问作者Karel
相关产品推荐
相关产品推荐

