请求修正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
相关产品推荐
相关产品推荐

