如何使用XSLT按逗号分隔的fileURL批量生成独立XML文件
XSLT批量拆分XML实现方案
本方案依赖XSLT 2.0及以上版本特性,需使用支持该版本的处理器(如Saxon)运行,默认的Xalan等1.0版本处理器无法执行
以下是可直接运行的完整XSLT代码:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 身份复制模板:默认全量复制所有节点、属性,不做修改 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- 单独匹配fileURL字段的value节点,替换为当前处理的单路径 --> <xsl:template match="property[name='fileurl']/value"> <xsl:param name="currentFileUrl" tunnel="yes"/> <xsl:copy> <xsl:value-of select="$currentFileUrl"/> </xsl:copy> </xsl:template> <!-- 处理入口:匹配根节点启动逻辑 --> <xsl:template match="/"> <!-- 读取原始多路径字符串 --> <xsl:variable name="rawUrlStr" select="//property[name='fileurl']/value"/> <!-- 拆分字符串、去除每个路径前后空格、过滤掉末尾逗号产生的空值 --> <xsl:variable name="validUrlList" select="tokenize($rawUrlStr, ',') ! normalize-space(.)[. != '']"/> <!-- 遍历每个合法路径生成独立XML文件 --> <xsl:for-each select="$validUrlList"> <xsl:variable name="currentSingleUrl" select="."/> <!-- 提取PDF文件名作为输出XML的文件名,可根据业务需求调整命名规则 --> <xsl:variable name="outputFileName" select="replace(tokenize($currentSingleUrl, '\\')[last()], '\.pdf$', '.xml')"/> <xsl:result-document method="xml" indent="yes" href="{$outputFileName}"> <!-- 隧道参数传入当前单路径,触发全量XML复制逻辑 --> <xsl:apply-templates select="/"> <xsl:with-param name="currentFileUrl" select="$currentSingleUrl" tunnel="yes"/> </xsl:apply-templates> </xsl:result-document> </xsl:for-each> </xsl:template> </xsl:stylesheet>
核心逻辑说明
- 用隧道参数传递当前处理的单路径,无需逐层传参即可在深层节点匹配模板中获取当前值
- 拆分路径后做了空白处理和空值过滤,避免原字符串末尾逗号产生无效文件
- 默认输出XML文件名为对应PDF文件名替换后缀为xml,如需调整输出路径或命名规则,修改
href属性的取值逻辑即可
运行示例
以Saxon处理器为例,命令行执行命令:java -jar saxon9he.jar -s:输入的工单XML文件路径 -xsl:上述XSLT文件路径
内容的提问来源于stack exchange,提问作者Rickard Hansson
相关产品推荐
相关产品推荐

