XSLT根据多个属性分组(完整示例代码)

转换前,

input:StudentList.xml

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<学生列表>
    <学生>
        <学号>111250071</学号>
        <个人基本信息>
            <姓名>揭同学</姓名>
            <性别></性别>
            <出生日期>1992-09-06</出生日期>
            <身份证号>44088119920906****</身份证号>
            <学校部门>
                <院系>软件学院</院系>
            </学校部门>
        </个人基本信息>
        <成绩信息>
            <成绩 成绩性质="平时成绩" 课程编号="123456">50</成绩>
            <成绩 成绩性质="期末成绩" 课程编号="123456">50</成绩>
            <成绩 成绩性质="总评成绩" 课程编号="123456">50</成绩>
            <成绩 成绩性质="平时成绩" 课程编号="123457">50</成绩>
            <成绩 成绩性质="期末成绩" 课程编号="123457">50</成绩>
            <成绩 成绩性质="总评成绩" 课程编号="123457">50</成绩>
        </成绩信息>
    </学生>
    <学生>
        <学号>111250074</学号>
        <个人基本信息>
            <姓名>雷同学</姓名>
            <性别></性别>
            <出生日期>1994-04-12</出生日期>
            <身份证号>43048119940412****</身份证号>
            <学校部门>
                <院系>软件学院</院系>
            </学校部门>
        </个人基本信息>
        <成绩信息>
            <成绩 成绩性质="平时成绩" 课程编号="123456">60</成绩>
            <成绩 成绩性质="期末成绩" 课程编号="123456">60</成绩>
            <成绩 成绩性质="总评成绩" 课程编号="123456">60</成绩>
            <成绩 成绩性质="平时成绩" 课程编号="123457">60</成绩>
            <成绩 成绩性质="期末成绩" 课程编号="123457">60</成绩>
            <成绩 成绩性质="总评成绩" 课程编号="123457">60</成绩>
        </成绩信息>
        </学生>
    <学生>
        <学号>111250078</学号>
        <个人基本信息>
            <姓名>李同学</姓名>
            <性别></性别>
            <出生日期>1993-09-06</出生日期>
            <身份证号>44088119920906****</身份证号>
            <学校部门>
                <院系>软件学院</院系>
            </学校部门>
            </个人基本信息>
            <成绩信息>
                <成绩 成绩性质="平时成绩" 课程编号="123456">70</成绩>
                <成绩 成绩性质="期末成绩" 课程编号="123456">70</成绩>
                <成绩 成绩性质="总评成绩" 课程编号="123456">70</成绩>
                <成绩 成绩性质="平时成绩" 课程编号="123457">70</成绩>
                <成绩 成绩性质="期末成绩" 课程编号="123457">70</成绩>
                <成绩 成绩性质="总评成绩" 课程编号="123457">70</成绩>
            </成绩信息>
    </学生>
    <学生>
        <学号>111250095</学号>
        <个人基本信息>
            <姓名>刘同学</姓名>
            <性别></性别>
            <出生日期>1992-10-08</出生日期>
            <身份证号>44088119920906****</身份证号>
            <学校部门>
                <院系>软件学院</院系>
            </学校部门>
        </个人基本信息>
        <成绩信息>
            <成绩 成绩性质="平时成绩" 课程编号="123456">80</成绩>
            <成绩 成绩性质="期末成绩" 课程编号="123456">80</成绩>
            <成绩 成绩性质="总评成绩" 课程编号="123456">80</成绩>
            <成绩 成绩性质="平时成绩" 课程编号="123457">80</成绩>
            <成绩 成绩性质="期末成绩" 课程编号="123457">80</成绩>
            <成绩 成绩性质="总评成绩" 课程编号="123457">80</成绩>
        </成绩信息>
    </学生>
</学生列表>

要求转换为以下形式的XML,即根据课程编号和成绩性质进行分组,

output:ScoreList.xml

<?xml version="1.0" encoding="UTF-8"?>
<课程成绩列表>
    <课程成绩 课程编号="123456" 成绩性质="平时成绩">
        <成绩>
            <学号>111250071</学号>
            <得分>50</得分>
        </成绩>
        <成绩>
            <学号>111250074</学号>
            <得分>60</得分>
        </成绩>
        <成绩>
            <学号>111250078</学号>
            <得分>70</得分>
        </成绩>
        <成绩>
            <学号>111250095</学号>
            <得分>80</得分>
        </成绩>
    </课程成绩>
    <课程成绩 课程编号="123456" 成绩性质="期末成绩">
        <成绩>
            <学号>111250071</学号>
            <得分>50</得分>
        </成绩>
        <成绩>
            <学号>111250074</学号>
            <得分>60</得分>
        </成绩>
        <成绩>
            <学号>111250078</学号>
            <得分>70</得分>
        </成绩>
        <成绩>
            <学号>111250095</学号>
            <得分>80</得分>
        </成绩>
    </课程成绩>
    <课程成绩 课程编号="123456" 成绩性质="总评成绩">
        <成绩>
            <学号>111250071</学号>
            <得分>50</得分>
        </成绩>
        <成绩>
            <学号>111250074</学号>
            <得分>60</得分>
        </成绩>
        <成绩>
            <学号>111250078</学号>
            <得分>70</得分>
        </成绩>
        <成绩>
            <学号>111250095</学号>
            <得分>80</得分>
        </成绩>
    </课程成绩>
    <课程成绩 课程编号="123457" 成绩性质="平时成绩">
        <成绩>
            <学号>111250071</学号>
            <得分>50</得分>
        </成绩>
        <成绩>
            <学号>111250074</学号>
            <得分>60</得分>
        </成绩>
        <成绩>
            <学号>111250078</学号>
            <得分>70</得分>
        </成绩>
        <成绩>
            <学号>111250095</学号>
            <得分>80</得分>
        </成绩>
    </课程成绩>
    <课程成绩 课程编号="123457" 成绩性质="期末成绩">
        <成绩>
            <学号>111250071</学号>
            <得分>50</得分>
        </成绩>
        <成绩>
            <学号>111250074</学号>
            <得分>60</得分>
        </成绩>
        <成绩>
            <学号>111250078</学号>
            <得分>70</得分>
        </成绩>
        <成绩>
            <学号>111250095</学号>
            <得分>80</得分>
        </成绩>
    </课程成绩>
    <课程成绩 课程编号="123457" 成绩性质="总评成绩">
        <成绩>
            <学号>111250071</学号>
            <得分>50</得分>
        </成绩>
        <成绩>
            <学号>111250074</学号>
            <得分>60</得分>
        </成绩>
        <成绩>
            <学号>111250078</学号>
            <得分>70</得分>
        </成绩>
        <成绩>
            <学号>111250095</学号>
            <得分>80</得分>
        </成绩>
    </课程成绩>
</课程成绩列表>

stlst2sclst.xsl:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <课程成绩列表>
            <xsl:apply-templates />
        </课程成绩列表>
    </xsl:template>
    <xsl:key name="groupByCourseId" match="成绩" use="concat(@课程编号,'+',@成绩性质)"></xsl:key>

    <xsl:template match="学生列表">
        <xsl:apply-templates
            select="//成绩[generate-id(.)=generate-id(key('groupByCourseId',concat(@课程编号,'+',@成绩性质))[1])]"
            mode="inGroup" />
    </xsl:template>

    <xsl:template match="//成绩" mode="inGroup">
        <课程成绩>
            <xsl:attribute name="课程编号"><xsl:value-of select="@课程编号" /></xsl:attribute>
            <xsl:attribute name="成绩性质"><xsl:value-of select="@成绩性质" /></xsl:attribute>
            
            <xsl:for-each select="key('groupByCourseId', concat(@课程编号,'+',@成绩性质))">
                <成绩>
                    <学号>
                        <xsl:value-of select="../../学号" />
                    </学号>
                    <得分>
                        <xsl:value-of select="." />
                    </得分>
                </成绩>

            </xsl:for-each>
        </课程成绩>
    </xsl:template>

</xsl:stylesheet>

Java验证代码:

package dom;

import java.io.FileInputStream;
import java.io.FileOutputStream;

import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Templates;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;

public class XSLT {

    public static void main(String[] args) {
        String inFilename = "xml/StudentList.xml";
        String outFilename = "xml/ScoreList.xml";
        String xslFilename = "xml/stlst2sclst.xsl";
        try {
            TransformerFactory factory = TransformerFactory.newInstance();

            Templates template = factory.newTemplates(new StreamSource(
                    new FileInputStream(xslFilename)));

            Transformer xformer = template.newTransformer();

            Source source = new StreamSource(new FileInputStream(inFilename));
            Result result = new StreamResult(new FileOutputStream(outFilename));

            xformer.transform(source, result);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 

转载于:https://www.cnblogs.com/leimiaomiao/p/3710841.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值