You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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">
&amp;lt;!DOCTYPE html&amp;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">
&amp;lt;!DOCTYPE html&amp;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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:18:36