XPath 1.0重复数据透视求助:按MEREMK合并行转多列
解决XPath 1.0中按MEREMK分组透视测试数据的问题
问题背景
同一MEREMK(序列号)的测试数据分散在多个<Custom>节点中,需要将数据透视转换为每行对应一个唯一MEREMK,测试类型(如VISUAL、DIELECTRIC)作为列展示对应的M8RVAL值。此前使用的XPath表达式会返回全局第一个符合测试类型条件的M8RVAL,而非当前MEREMK的对应值。
示例XML
<Root> <Custom> <MEREMK>111222333</MEREMK> <PJTX15>VISUAL</PJTX15> <M8RVAL>Pass1</M8RVAL> </Custom> <Custom> <MEREMK>111222333</MEREMK> <PJTX15>DIELECTRIC</PJTX15> <M8RVAL>Fail1</M8RVAL> </Custom> <Custom> <MEREMK>222333444</MEREMK> <PJTX15>VISUAL</PJTX15> <M8RVAL>Pass2</M8RVAL> </Custom> <Custom> <MEREMK>222333444</MEREMK> <PJTX15>DIELECTRIC</PJTX15> <M8RVAL>Pass3</M8RVAL> </Custom> </Root>
解决方案
1. 纯XPath精准查询(针对单个MEREMK)
要获取指定MEREMK的对应测试类型值,必须限定查询范围在当前MEREMK的<Custom>节点集合内,避免全局匹配:
- 获取MEREMK
111222333的VISUAL测试值://Custom[MEREMK='111222333' and PJTX15='VISUAL']/M8RVAL/text() - 获取MEREMK
222333444的DIELECTRIC测试值://Custom[MEREMK='222333444' and PJTX15='DIELECTRIC']/M8RVAL/text()
2. XSLT 1.0实现分组透视(生成目标表格结构)
纯XPath 1.0无法直接完成分组和表格输出,需结合XSLT的分组功能实现:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 定义分组键,按MEREMK分组所有Custom节点 --> <xsl:key name="meremk-group" match="Custom" use="MEREMK"/> <xsl:template match="/"> <table> <!-- 表头 --> <tr> <th>MEREMK</th> <th>VISUAL</th> <th>DIELECTRIC</th> </tr> <!-- 遍历每个唯一MEREMK的分组(去重) --> <xsl:for-each select="Root/Custom[generate-id() = generate-id(key('meremk-group', MEREMK)[1])]"> <tr> <td><xsl:value-of select="MEREMK"/></td> <!-- 提取当前分组下VISUAL对应的M8RVAL --> <td><xsl:value-of select="key('meremk-group', MEREMK)[PJTX15='VISUAL']/M8RVAL"/></td> <!-- 提取当前分组下DIELECTRIC对应的M8RVAL --> <td><xsl:value-of select="key('meremk-group', MEREMK)[PJTX15='DIELECTRIC']/M8RVAL"/></td> </tr> </xsl:for-each> </table> </xsl:template> </xsl:stylesheet>
该方案通过<xsl:key>建立MEREMK分组,用generate-id()确保每个MEREMK只处理一次,再从分组内精准匹配对应测试类型的M8RVAL值,最终生成目标行列结构。
内容的提问来源于stack exchange,提问作者Trevor Adam
相关产品推荐
相关产品推荐

