XSLT2.0字符串拼接顺序问题求助:结果未按预期序列返回
问题根源与解决方案
你遇到的问题核心在于使用了|(节点集并集运算符),它的作用是合并多个节点集,最终返回的节点是按文档顺序排列的,而不是你在代码中写的顺序。虽然你的XML里三个节点的文档顺序刚好是你想要的,但这种写法不够可靠——如果后续XML结构调整(比如节点位置变化),或者你需要强制固定输出顺序,|就会打乱你的预期。
正确的写法(XSLT 2.0+)
改用逗号分隔的序列来指定你要的输出顺序,这样就能严格按照你定义的顺序,只输出有内容的节点,并用逗号分隔:
<tns:description> <xsl:value-of select="(LExpenseType[node()], VendorName[node()], LDescription[node()])" separator=","/> </tns:description>
为什么这样能解决问题?
|运算符:合并节点集后会自动按文档顺序重排节点,忽略你写的顺序- 逗号分隔的序列:完全遵循你指定的顺序,依次检查每个节点是否有内容(
[node()]判断非空),有内容就加入序列,最终按你写的顺序输出,不会打乱排列
如果你用的是XSLT 1.0(不支持separator和序列)
可以手动拼接内容,控制顺序和逗号:
<tns:description> <!-- 输出LExpenseType,如果后面还有非空节点则加逗号 --> <xsl:if test="LExpenseType[node()]"> <xsl:value-of select="LExpenseType"/> <xsl:if test="VendorName[node()] or LDescription[node()]">,</xsl:if> </xsl:if> <!-- 输出VendorName,如果后面还有非空节点则加逗号 --> <xsl:if test="VendorName[node()]"> <xsl:value-of select="VendorName"/> <xsl:if test="LDescription[node()]">,</xsl:if> </xsl:if> <!-- 输出LDescription --> <xsl:if test="LDescription[node()]"> <xsl:value-of select="LDescription"/> </xsl:if> </tns:description>
如果你的XSLT处理器支持2.0及以上版本,优先用第一种方法,简洁且能稳定保证顺序符合预期。
内容的提问来源于stack exchange,提问作者Vishnu Prakash
相关产品推荐
相关产品推荐

