nxp10009@NXL01366 /c/xsltdemo $ ls -la total 4786 drwxr-xr-x 6 nxp10009 Administ 0 Feb 15 16:35 . drwxr-xr-x 1 nxp10009 Administ 12288 Feb 15 16:19 .. -rw-r--r-- 1 nxp10009 Administ 9788993 Oct 30 13:42 Saxon-HE-9.4.jar drwxr-xr-x 4 nxp10009 Administ 0 Feb 15 16:34 input drwxr-xr-x 4 nxp10009 Administ 0 Feb 15 17:18 output drwxr-xr-x 4 nxp10009 Administ 0 Feb 15 17:03 xslt nxp10009@NXL01366 /c/xsltdemo/input $ ls -la total 1 drwxr-xr-x 4 nxp10009 Administ 0 Feb 15 16:34 . drwxr-xr-x 6 nxp10009 Administ 0 Feb 15 16:35 .. -rw-r--r-- 1 nxp10009 Administ 47 Feb 15 16:46 studentinfo.csv -rw-r--r-- 1 nxp10009 Administ 576 Feb 15 17:13 students.xml
studentinfo.csv
1, m, developer 2, m, developer 3, f, model
students.xml
<?xml version="1.0" encoding="UTF-8" ?> <students> <student> <firstname>Robby</firstname> <lastname>Pelssers</lastname> <dateofbirth>1977-02-07</dateofbirth> <studentid>1</studentid> </student> <student> <firstname>Ivan</firstname> <lastname>Lagunov</lastname> <dateofbirth>1987-04-30</dateofbirth> <studentid>2</studentid> </student> <student> <firstname>Pamela</firstname> <lastname>Anderson</lastname> <dateofbirth>1967-07-01</dateofbirth> <studentid>3</studentid> </student> </students>
So the first thing I did was creating an XML representation of that CSV file using below xslt.
studentinfo.xslt
<?xml version="1.0" encoding="UTF-8"?> <!-- Author: Robby Pelssers Transforms studentinfo.csv into XML representation Usage from DOS-Shell: java -jar Saxon-HE-9.4.jar -o:C:/xsltdemo/output/studentinfo.xml -it:main -xsl:C:/xsltdemo/xslt/studentinfo.xslt studentinfoCSV=file:/C:/xsltdemo/input/studentinfo.csv --> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> <xsl:param name="studentinfoCSV" /> <xsl:variable name="linefeed" select="'\r?\n'"/> <xsl:variable name="csv" select="unparsed-text($studentinfoCSV)"/> <xsl:template match="/" name="main"> <info> <xsl:for-each select="tokenize($csv, $linefeed)"> <xsl:variable name="fields" select="tokenize(., ',')"/> <studentinfo id="{normalize-space($fields[1])}"> <gender><xsl:sequence select="normalize-space($fields[2])"/></gender> <profession><xsl:sequence select="normalize-space($fields[3])"/></profession> </studentinfo> </xsl:for-each> </info> </xsl:template> </xsl:stylesheet>
So after the transformation a new file studentinfo.xml gets generated as below.
<?xml version="1.0" encoding="UTF-8"?> <info> <studentinfo id="1"> <gender>m</gender> <profession>developer</profession> </studentinfo> <studentinfo id="2"> <gender>m</gender> <profession>developer</profession> </studentinfo> <studentinfo id="3"> <gender>f</gender> <profession>model</profession> </studentinfo> </info>
So now we need to execute a second transform using as input students.xml and studentinfo.xml.
student_addinfo.xslt
<?xml version="1.0" encoding="UTF-8"?> <!-- Author: Robby Pelssers java -Xmx1024m -jar Saxon-HE-9.4.jar -s:C:/xsltdemo/input/students.xml -o:C:/xsltdemo/output/students-full.xml -xsl:C:/xsltdemo/xslt/student_addinfo.xslt studentinfoXML=file:/C:/xsltdemo/output/studentinfo.xml --> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> <xsl:param name="studentinfoXML" /> <xsl:variable name="studentinfoDocument" select="document($studentinfoXML)"/> <xsl:key name="student-lookup" match="studentinfo" use="@id"/> <xsl:template match="/"> <xsl:apply-templates/> </xsl:template> <xsl:template match="student"> <student> <!-- we copy all present attributes and children --> <xsl:apply-templates select="@* | node()"/> <!-- now we also want to add the additional information as children --> <xsl:apply-templates select="key('student-lookup', studentid, $studentinfoDocument)/*"/> </student> </xsl:template> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*"/> <xsl:apply-templates/> </xsl:copy> </xsl:template> </xsl:stylesheet>
And finally we get the merged result:
<?xml version="1.0" encoding="UTF-8"?> <students> <student> <firstname>Robby</firstname> <lastname>Pelssers</lastname> <dateofbirth>1977-02-07</dateofbirth> <studentid>1</studentid> <gender>m</gender> <profession>developer</profession> </student> <student> <firstname>Ivan</firstname> <lastname>Lagunov</lastname> <dateofbirth>1987-04-30</dateofbirth> <studentid>2</studentid> <gender>m</gender> <profession>developer</profession> </student> <student> <firstname>Pamela</firstname> <lastname>Anderson</lastname> <dateofbirth>1967-07-01</dateofbirth> <studentid>3</studentid> <gender>f</gender> <profession>model</profession> </student> </students>
No comments:
Post a Comment