如何修改XSLT代码实现拆分ImageURL后为标签自动添加序号
XSLT拆分分隔符链接生成带序号节点实现方法
核心需求说明
现有输入XML的<ImageURL>节点存储|分隔的多条图片链接,原转换逻辑拆分后生成同名<ImageURL>节点,需修改为生成<ImageURL1>、<ImageURL2>……带顺序编号的节点。
方案1:XSLT 2.0实现(推荐,写法更简洁)
直接调用内置tokenize()函数拆分字符串,遍历拆分结果时用position()获取序号动态生成节点名:
<!-- 处理ImageURL节点的模板 --> <xsl:template match="ImageURL"> <xsl:for-each select="tokenize(., '\|')"> <!-- position()返回当前遍历项的顺序,从1开始计数 --> <xsl:element name="ImageURL{position()}"> <xsl:value-of select="normalize-space(.)"/> </xsl:element> </xsl:for-each> </xsl:template>
注意:
|是正则特殊字符,拆分时需要加反斜杠转义为\|。
方案2:修改现有XSLT 1.0递归拆分模板
如果需要保持XSLT 1.0兼容,在原有递归拆分逻辑的基础上,新增序号传递参数即可:
<!-- 入口模板:匹配原ImageURL节点 --> <xsl:template match="ImageURL"> <!-- 调用递归拆分模板,初始序号设为1 --> <xsl:call-template name="split-image-url"> <xsl:with-param name="input" select="."/> <xsl:with-param name="index" select="1"/> </xsl:call-template> </xsl:template> <!-- 递归拆分模板 --> <xsl:template name="split-image-url"> <xsl:param name="input"/> <xsl:param name="index"/> <xsl:choose> <xsl:when test="contains($input, '|')"> <!-- 取当前段生成带序号节点 --> <xsl:element name="ImageURL{$index}"> <xsl:value-of select="normalize-space(substring-before($input, '|'))"/> </xsl:element> <!-- 递归处理剩余内容,序号+1 --> <xsl:call-template name="split-image-url"> <xsl:with-param name="input" select="substring-after($input, '|')"/> <xsl:with-param name="index" select="$index + 1"/> </xsl:call-template> </xsl:when> <xsl:otherwise> <!-- 处理最后一段内容 --> <xsl:element name="ImageURL{$index}"> <xsl:value-of select="normalize-space($input)"/> </xsl:element> </xsl:otherwise> </xsl:choose> </xsl:template>
效果示例
输入:
<ImageURL>https://img1.example.com/1.jpg|https://img1.example.com/2.jpg|https://img1.example.com/3.jpg</ImageURL>
输出:
<ImageURL1>https://img1.example.com/1.jpg</ImageURL1> <ImageURL2>https://img1.example.com/2.jpg</ImageURL2> <ImageURL3>https://img1.example.com/3.jpg</ImageURL3>
内容的提问来源于stack exchange,提问作者Tom Arm
相关产品推荐
相关产品推荐

