如何在XSLT 1.0中用"/"分隔符拼接多个节点值?
解决方案:用XSLT合并多个value节点为带分隔符的文本
针对你需要将多个<value>节点的内容用/分隔并包裹到<g:color>标签的需求,这里提供两种适配不同XSLT版本的实现方式:
方法1:XSLT 2.0+(推荐,更简洁)
直接使用<xsl:value-of>的separator属性,无需手动遍历:
<g:color> <xsl:value-of select="parameter[@name='color']/value" separator="/"/> </g:color>
这个方法会自动把所有value节点的文本用/拼接,不管节点数量是1个还是多个,都能正确输出。
方法2:XSLT 1.0(兼容旧版本环境)
如果你的环境只能用XSLT 1.0,可以通过<xsl:for-each>结合position()判断来避免最后一个节点后多加分隔符:
<g:color> <xsl:for-each select="parameter[@name='color']/value"> <xsl:value-of select="."/> <!-- 只有当前节点不是最后一个时,才输出分隔符 --> <xsl:if test="position() != last()"> <xsl:text>/</xsl:text> </xsl:if> </xsl:for-each> </g:color>
你之前遇到的错误大概率是没有判断节点位置,直接在每个value后都加了/,导致最后多出来一个分隔符,或者语法写错(比如<xsl:text>的闭合问题)。上面的代码通过position() != last()的判断,只会在非最后一个节点后输出/,完全符合需求。
测试示例
输入XML:
<parameter name='color'> <value>black</value> <value>white</value> <value>gray</value> </parameter>
输出结果:
<g:color>black/white/gray</g:color>
如果只有一个value节点,输出会是<g:color>black</g:color>,不会出现多余的分隔符。
内容的提问来源于stack exchange,提问作者Piotr Orczyk
相关产品推荐
相关产品推荐

