寻求XML转文本的XSLT转换方案:源与目标行合并展示
XSLT模板:将源端与目标端XML记录合并为同行文本
没问题,我帮你搞定这个需求——把XML里源端(row host="src")和目标端(row host="targ")的对应记录配对,放在同一行输出成简洁的纯文本,还能适配动态生成的<col>节点。
先给你一个示例XML结构(方便对应理解模板):
<?xml version="1.0" encoding="UTF-8"?> <report> <row host="src"> <col name="ID">101</col> <col name="Name">Alice</col> <col name="Email">alice@example.com</col> </row> <row host="targ"> <col name="ID">101</col> <col name="Name">Alice</col> <col name="Email">alice_new@example.com</col> </row> <row host="src"> <col name="ID">102</col> <col name="Name">Bob</col> </row> <row host="targ"> <col name="ID">102</col> <col name="Name">Robert</col> </row> </report>
接下来是核心的XSLT模板:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text" encoding="UTF-8" indent="no"/> <!-- 匹配根节点,遍历所有源端记录 --> <xsl:template match="/"> <!-- 可选表头,不需要可直接删除 --> <xsl:text>源端记录 | 目标端记录 </xsl:text> <xsl:text>------------------------ </xsl:text> <xsl:for-each select="//row[@host='src']"> <!-- 获取配对标识(这里用第一个col的值,可按需修改为特定列如col[@name='ID']) --> <xsl:variable name="srcKey" select="col[1]"/> <!-- 找到对应的目标端记录 --> <xsl:variable name="matchingTarg" select="//row[@host='targ'][col[1]=$srcKey]"/> <!-- 拼接源端所有动态col的内容 --> <xsl:variable name="srcContent"> <xsl:for-each select="col"> <xsl:value-of select="concat(@name, ': ', ., '; ')"/> </xsl:for-each> </xsl:variable> <!-- 拼接目标端所有动态col的内容 --> <xsl:variable name="targContent"> <xsl:for-each select="$matchingTarg/col"> <xsl:value-of select="concat(@name, ': ', ., '; ')"/> </xsl:for-each> </xsl:variable> <!-- 输出同行的源端+目标端内容,分隔符可自定义 --> <xsl:value-of select="concat($srcContent, ' | ', $targContent, ' ')"/> </xsl:for-each> </xsl:template> </xsl:stylesheet>
关键细节说明
- 配对逻辑:默认用每条记录的第一个
<col>值作为配对键(比如示例里的ID),如果你的配对依据是特定列,直接把$srcKey改成col[@name='你的列名']即可,更精准。 - 动态
<col>适配:通过for-each自动遍历所有<col>节点,不管列数多少、列名是什么,都能自动拼接成列名: 值;的格式。 - 格式自定义:输出用
|分隔源端和目标端内容,你可以换成制表符、逗号等;如果不需要表头,直接删掉输出表头的两行代码就行。
内容的提问来源于stack exchange,提问作者Abbas
相关产品推荐
相关产品推荐

