转换前,
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(); } } }