XSLT转换XML格式时同一标签映射多个值问题排查求助
错误点说明
for-each-group的分组条件错误
原代码中group-by="/MESSAGES/COMMANDSTATUS/ORDER/@O_ID"使用了绝对路径,会取文档中所有ORDER节点的O_ID属性作为全局分组依据,而非对应当前遍历的ORDER节点自身的O_ID,需改为相对路径group-by="@O_ID"。
- 没有循环遍历
ORDER_LINE节点
原代码第二层for-each是遍历分组后的ORDER节点,直接取./ORDER_LINE/@SKU会一次性读取该ORDER下所有ORDER_LINE的SKU属性,XSLT 2.0中xsl:value-of读取多值时默认用空格拼接输出,所以才会出现多个SKU、数量挤在同一个标签里的情况,需改为循环每个ORDER下的ORDER_LINE节点,每个节点对应生成一个lineItems标签。
- 没有循环遍历
- URL中&符号的转义适配
XML规范默认要求&必须转义为&,如果需要和预期输出一致输出未转义的&,可以在输出tracking_url的xsl:value-of上添加disable-output-escaping="yes"属性。
- URL中&符号的转义适配
修正后XSLT代码
<?xml version="1.0" encoding="UTF-8" ?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="yes" /> <xsl:template match="/"> <root> <xsl:for-each-group select="/MESSAGES/COMMANDSTATUS/ORDER" group-by="@O_ID"> <orders> <id> <xsl:value-of select="current-grouping-key()" /> </id> <xsl:for-each select="current-group()"> <tracking_url> <xsl:value-of select="@TRACKING_URL" disable-output-escaping="yes"/> </tracking_url> <!-- 遍历每个订单行生成单独的lineItems --> <xsl:for-each select="./ORDER_LINE"> <lineItems> <sku> <xsl:value-of select="@SKU" /> </sku> <quantity> <xsl:value-of select="@QUANTITY" /> </quantity> </lineItems> </xsl:for-each> </xsl:for-each> </orders> </xsl:for-each-group> </root> </xsl:template> </xsl:stylesheet>
内容的提问来源于stack exchange,提问作者Kiran
相关产品推荐
相关产品推荐

