如何在XSL中将含inline/attachment的URL转换为带文件扩展名的URL?
可以通过XSL实现这个URL转换,但需要明确参数来源
当然可以实现!不过首先得梳理清楚两个URL之间的对应关系,以及那些原始URL里没有的参数的来源——毕竟目标URL里包含一些原URL不存在的内容(比如48、哈希值9a4191c7ce7414650d36ac9bc1c2b012261013ad、image/png这类)。如果这些参数能从你的XML文档的其他节点获取,或者是固定配置值,那XSL就能完美完成转换。
第一步:拆解URL的对应逻辑
先把两个URL的关键部分做对应:
- 原始URL中的
file/id/1001974122→ 目标URL中的1001974122(出现两次) - 原始URL中的
file_version/name/small→ 目标URL末尾的_small - 原始URL中的
disposition/inline→ 目标URL中的partitions-inline
另外目标URL里的其他部分:
48、1001、1001974000:看起来是对1001974122的拆分(比如前4位、前7位补0)- 哈希值、
image/png、末尾的UUID部分:需要从XML的其他字段获取,或者是固定值
第二步:XSLT实现示例(以XSLT 2.0为例)
假设你的XML已经包含所有需要的额外参数,比如:
<data> <fileUrl>api/v1/objects/uuid/b79de4e5-8d1f-4840-b85f-e052db92a52f/file/id/1001974122/file_version/name/small/disposition/inline</fileUrl> <hash>9a4191c7ce7414650d36ac9bc1c2b012261013ad</hash> <fileType>image/png</fileType> <endUuid>33a8cae1-a9fa-4655-8c3d-b71241bbc99b</endUuid> </data>
对应的XSLT代码可以这样写:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text" encoding="UTF-8"/> <xsl:template match="/"> <!-- 从原始URL提取关键参数 --> <xsl:variable name="fileUrl" select="data/fileUrl"/> <xsl:variable name="fileId" select="tokenize($fileUrl, '/')[position() = tokenize($fileUrl, '/')[.='file/id']/position() + 1]"/> <xsl:variable name="versionName" select="tokenize($fileUrl, '/')[position() = tokenize($fileUrl, '/')[.='file_version/name']/position() + 1]"/> <xsl:variable name="disposition" select="tokenize($fileUrl, '/')[position() = tokenize($fileUrl, '/')[.='disposition']/position() + 1]"/> <!-- 计算fileId的拆分部分 --> <xsl:variable name="fileIdPrefix4" select="substring($fileId, 1, 4)"/> <xsl:variable name="fileIdPrefix7" select="substring($fileId, 1, 7)"/> <xsl:variable name="fileIdGroup" select="concat($fileIdPrefix7, '000')"/> <!-- 假设partition是固定值48,若不是可从XML其他节点获取 --> <xsl:variable name="partition" select="'48'"/> <!-- 拼接目标URL --> <xsl:value-of select="concat( 'eas/partitions-', $disposition, '/', $partition, '/', $fileIdPrefix4, '/', $fileIdGroup, '/', $fileId, '/', data/hash, '/', data/fileType, '/', '8223@', data/endUuid, '_', $fileId, '_', $versionName, '.png' )"/> </xsl:template> </xsl:stylesheet>
关键注意事项
- 如果你的环境只能用XSLT 1.0,需要用递归模板替代
tokenize函数来提取URL参数——XSLT 1.0没有原生字符串拆分功能,但可以通过自定义模板实现类似逻辑。 - 如果目标URL中的某些参数(比如那个哈希值)是服务器动态生成的,且未存储在XML中,那仅靠XSL无法生成——因为XSL是静态转换工具,无法调用后端的计算逻辑。这种情况需要先通过后端把这些参数写入XML,再用XSL转换。
内容的提问来源于stack exchange,提问作者Oleg_08
相关产品推荐
相关产品推荐

