如何用XSL遍历XML元素属性并拼接url替换首个元素属性值
实现方案
核心实现逻辑如下:
- 首先使用身份变换模板原样复制所有不需要修改的节点和属性
- 匹配
<large>节点下的第一个<image>元素,将其url属性替换为所有同层级<image>元素的url属性值,用///拼接 - 屏蔽
<large>节点下除第一个以外的其余<image>元素,不输出
你原代码的问题在于匹配到image元素后又错误尝试在image元素下查找子元素image,路径逻辑完全错误,也没有保留其余节点结构和属性,因此无法得到预期结果。
以下是可直接运行的完整XSLT代码:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0"> <!-- 身份变换模板:所有未匹配到的节点/属性原样输出 --> <xsl:template match="@* | node()"> <xsl:copy> <xsl:apply-templates select="@* | node()"/> </xsl:copy> </xsl:template> <!-- 匹配large下的第一个image元素 --> <xsl:template match="large/image[1]"> <xsl:copy> <!-- 复制除url外的所有原有属性 --> <xsl:apply-templates select="@*[name() != 'url']"/> <!-- 重写url属性:拼接所有同层级image的url,用///分隔 --> <xsl:attribute name="url" select="string-join(../image/@url, '///')"/> </xsl:copy> </xsl:template> <!-- 匹配large下除第一个以外的image元素,不输出 --> <xsl:template match="large/image[position() > 1]"/> </xsl:stylesheet>
该代码和你使用的XSLT 2.0版本兼容,运行后会完全输出你预期的结果:外层节点全部保留,只保留第一个image标签,url属性自动拼接所有image的地址,其余属性保持不变。
内容的提问来源于stack exchange,提问作者Sioulis Nick
相关产品推荐
相关产品推荐

