基于条件的XSLT 2 XML结构修改需求咨询
XSLT2实现按D_350值匹配重组G_HL节点顺序
需求说明
源XML里有两类G_HL节点:
- 一类是
S_HL/D_735='T'的节点,靠S_PO4/D_350作为匹配标识 - 另一类是
S_HL/D_735='I'的节点,靠S_LIN/D_350作为匹配标识
需要把每个D_735='I'的节点,紧跟在D_350值完全匹配的D_735='T'节点后面,输出重组后的XML结构。
解决方案代码
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 基础模板:原样复制所有节点和属性 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- 处理根节点,按D_350分组重组G_HL --> <xsl:template match="/"> <xsl:copy> <!-- 按D_350值分组:自动识别T/I节点的D_350字段 --> <xsl:for-each-group select="*/G_HL" group-by="(S_PO4/D_350, S_LIN/D_350)[1]"> <!-- 先输出当前组内的T类型节点 --> <xsl:apply-templates select="current-group()[S_HL/D_735='T']"/> <!-- 再输出当前组内对应的I类型节点 --> <xsl:apply-templates select="current-group()[S_HL/D_735='I']"/> </xsl:for-each-group> </xsl:copy> </xsl:template> </xsl:stylesheet>
代码逻辑解释
- 基础复制模板:不用手动复制每个节点的结构,自动保留所有原始内容和属性。
- 分组重组逻辑:
- 用
xsl:for-each-group按D_350值分组,不管是T节点的S_PO4/D_350还是I节点的S_LIN/D_350,自动取存在的那个值作为分组键。 - 每组内先输出T节点,再输出对应的I节点,直接实现“T紧跟对应I”的顺序要求。
- 用
源XML示例
<root> <G_HL> <S_HL> <D_735>T</D_735> </S_HL> <S_PO4> <D_65>0.000</D_65> <D_350>000010</D_350> </S_PO4> <S_MAN> <D_88>GM</D_88> </S_MAN> </G_HL> <G_HL> <S_HL> <D_735>T</D_735> </S_HL> <S_PO4> <D_65>0.000</D_65> <D_350>000020</D_350> </S_PO4> <S_MAN> <D_88>GM</D_88> </S_MAN> </G_HL> <G_HL> <S_HL> <D_735>I</D_735> </S_HL> <S_LIN> <D_350>000010</D_350> <D_235>BP</D_235> </S_LIN> <S_SN1> <D_355>EA</D_355> </S_SN1> </G_HL> <G_HL> <S_HL> <D_735>I</D_735> </S_HL> <S_LIN> <D_350>000020</D_350> <D_235>BP</D_235> </S_LIN> <S_SN1> <D_355>EA</D_355> </S_SN1> </G_HL> </root>
期望输出XML
<root> <G_HL> <S_HL> <D_735>T</D_735> </S_HL> <S_PO4> <D_65>0.000</D_65> <D_350>000010</D_350> </S_PO4> <S_MAN> <D_88>GM</D_88> </S_MAN> </G_HL> <G_HL> <S_HL> <D_735>I</D_735> </S_HL> <S_LIN> <D_350>000010</D_350> <D_235>BP</D_235> </S_LIN> <S_SN1> <D_355>EA</D_355> </S_SN1> </G_HL> <G_HL> <S_HL> <D_735>T</D_735> </S_HL> <S_PO4> <D_65>0.000</D_65> <D_350>000020</D_350> </S_PO4> <S_MAN> <D_88>GM</D_88> </S_MAN> </G_HL> <G_HL> <S_HL> <D_735>I</D_735> </S_HL> <S_LIN> <D_350>000020</D_350> <D_235>BP</D_235> </S_LIN> <S_SN1> <D_355>EA</D_355> </S_SN1> </G_HL> </root>
内容的提问来源于stack exchange,提问作者AnirD
相关产品推荐
相关产品推荐

