为XML中_id与_ref字段追加后缀的XSLT问题求助
解决XML中批量给特定节点值追加固定后缀的XSLT问题
你遇到的核心问题是原XSLT错误使用了绝对路径表达式,导致所有匹配节点都取到文档中第一个对应节点的值,而非当前节点自身的文本内容。下面是完整的修正方案:
问题分析
原代码里的<xsl:value-of select="concat(//_JsonReader_PS_id, '6869')"/>用了//,这会从根节点开始查找所有匹配节点,然后取第一个节点的值。不管处理的是哪个_JsonReader_PS_id,都会把第一个节点的内容(比如示例里的1)拼接6869,完全不符合需求。我们需要获取当前节点的文本值,只需要用.即可。
修正后的XSLT代码
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> <xsl:strip-space elements="*"/> <!-- 身份转换模板:默认复制所有节点、属性和文本 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- 处理_JsonReader_PS_id节点:追加后缀6869 --> <xsl:template match="_JsonReader_PS_id"> <xsl:copy> <xsl:value-of select="concat(., '6869')"/> </xsl:copy> </xsl:template> <!-- 处理_JsonReader_PS_ref节点:追加后缀6869 --> <xsl:template match="_JsonReader_PS_ref"> <xsl:copy> <xsl:value-of select="concat(., '6869')"/> </xsl:copy> </xsl:template> </xsl:stylesheet>
关键修改点
- 移除了原代码中无用的
<xsl:key name="id" match="ID" use="." />(你的XML里没有ID节点,这个键定义完全无效) - 将模板中的
//_JsonReader_PS_id和//_JsonReader_PS_ref替换为.,.代表当前上下文节点的文本内容,确保每个节点都用自身值拼接后缀 - 保留身份转换模板,保证XML的其他结构(包括
<?xml-multiple Children?>处理指令、Guid节点等)完全不变
效果验证
用这个修正后的XSLT处理你的示例输入XML,会生成你期望的输出:所有_JsonReader_PS_id和_JsonReader_PS_ref的文本值都正确追加了6869,其余节点和结构保持原样。
内容的提问来源于stack exchange,提问作者Aditya
相关产品推荐
相关产品推荐

