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

请求修正XSLT代码:按<events>标签拆分XML文件

XSLT 2.0 按拆分XML文件的正确实现

以下是满足需求的XSLT 2.0代码,可生成完整结构的XML输出文件,处理无根元素场景,且用唯一<id>值命名输出文件:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <!-- 匹配文档根节点,先判断是否存在合法根元素 -->
    <xsl:template match="/">
        <xsl:if test="*">
            <!-- 遍历<events>下的每个<event>节点;若<events>本身是根元素,将路径改为`/events/event`即可 -->
            <xsl:for-each select="*/events/event">
                <!-- 用唯一<id>值命名输出文件,避免冲突 -->
                <xsl:result-document href="event_{id}.xml" method="xml" indent="yes">
                    <!-- 生成完整XML文档结构,保留原<event>的所有属性与子节点 -->
                    <event>
                        <xsl:copy-of select="@*|node()"/>
                    </event>
                </xsl:result-document>
            </xsl:for-each>
        </xsl:if>
    </xsl:template>

    <!-- 静默忽略冗余文本/属性,避免输出无效内容 -->
    <xsl:template match="text()|@*"/>
</xsl:stylesheet>

关键细节说明

  • 无根元素处理:通过<xsl:if test="*">判断输入XML是否存在根元素,无合法根元素时直接跳过,不会生成空文件。
  • 完整XML结构:使用<xsl:copy-of>复制<event>节点的所有属性与子节点,确保输出文件是标准XML文档,而非纯文本内容。
  • 文件名唯一性:利用<id>的唯一值命名输出文件(如event_101.xml),彻底避免文件名冲突。
  • 路径适配:若输入XML的<events>本身就是根元素(直接包裹所有<event>节点),只需将遍历路径select="*/events/event"修改为select="/events/event"即可。

示例验证

假设输入XML为:

<root>
    <events>
        <event>
            <id>101</id>
            <title>Product Launch</title>
        </event>
        <event>
            <id>102</id>
            <title>Tech Workshop</title>
        </event>
    </events>
</root>

运行后将生成两个独立XML文件:

  • event_101.xml:
<event>
    <id>101</id>
    <title>Product Launch</title>
</event>
  • event_102.xml:
<event>
    <id>102</id>
    <title>Tech Workshop</title>
</event>

原代码仅输出文本的问题,是因为未使用<xsl:result-document>生成完整XML文档,也未保留节点结构信息,上述代码完全解决了该问题。

内容的提问来源于stack exchange,提问作者raviteja

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 08:42:16