java - My xsl stylesheet generates an xml file with multiple roots -
i have problem in parsing xml files xslt stylesheets http://docs.oracle.com/javase/tutorial/jaxp/xslt/transformingxml.html changed bit in stylizer code input more 1 xml file (( give background ))
everything working root mutiplied !
this xsl code:
<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/xsl/transform" xmlns:exsl="http://exslt.org/common" extension-element-prefixes="exsl" version="1.0"> <xsl:output method="xml" omit-xml-declaration="yes"/> <xsl:template match="/"> <xsl:text>
</xsl:text> <request campus="uqu" year="2013" term="second"> <xsl:for-each select="/sis_rep070/list_g_student_id/g_student_id"> . . . <xsl:for-each select="document('sis_rep413b_anon.xml')/module1/list_g_student_id/g_student_id[student_id=$varid]"> . . . <xsl:for-each select="document('sis_rep814.xml')/sis_rep814/list_degree_plans/degree_plans[edition1=57][total_hrs=160]/list_g_course_level/g_course_level/list_g_course_code/g_course_code"> . . . </xsl:for-each> </request> </xsl:template> </xsl:stylesheet> as can see implementing stylesheet on several xmls
so root outputed x times ( x= xml input files )
this output looks :
<request campus="uqu" year="2013" term="second"> <student key="42701646"> <name first="فؤاد" last="خوج"/><max>0</max> <acadarea abbv="csandisg"><major code="143100"/></acadarea> <updatecourserequests commit="true"> <courseoffering1 subjectarea="relg" coursenumber="16312012" priority="19981.921" credit="2"/> </updatecourserequests></student> . . . . </request> <request campus="uqu" year="2013" term="second"/> <request campus="uqu" year="2013" term="second"/> <request campus="uqu" year="2013" term="second"/> the root "request" printed 3 more times !:( because entered 4 xml files command wrote in command prompt :
java stylizer data/file1.xsl data/file1.xml data/file2.xml data/file3.xml data/file4.xml the original stylizer:
import javax.xml.parsers.documentbuilder; import javax.xml.parsers.documentbuilderfactory; import javax.xml.parsers.factoryconfigurationerror; import javax.xml.parsers.parserconfigurationexception; import org.xml.sax.saxexception; import org.xml.sax.saxparseexception; import org.w3c.dom.document; import org.w3c.dom.domexception; // write operation import javax.xml.transform.transformer; import javax.xml.transform.transformerexception; import javax.xml.transform.transformerfactory; import javax.xml.transform.transformerconfigurationexception; import javax.xml.transform.dom.domsource; import javax.xml.transform.stream.streamsource; import javax.xml.transform.stream.streamresult; import java.io.*; public class stylizer { // global value can ref'd tree-adapter static document document; public static void main(string[] argv) { if (argv.length != 2) { system.err.println("usage: java stylizer stylesheet xmlfile"); system.exit(1); } documentbuilderfactory factory = documentbuilderfactory.newinstance(); //factory.setnamespaceaware(true); //factory.setvalidating(true); try { file stylesheet = new file(argv[0]); file datafile = new file(argv[1]); documentbuilder builder = factory.newdocumentbuilder(); document = builder.parse(datafile); // use transformer output transformerfactory tfactory = transformerfactory.newinstance(); streamsource stylesource = new streamsource(stylesheet); transformer transformer = tfactory.newtransformer(stylesource); domsource source = new domsource(document); streamresult result = new streamresult(system.out); transformer.transform(source, result); } catch (transformerconfigurationexception tce) { // error generated parser system.out.println("\n** transformer factory error"); system.out.println(" " + tce.getmessage()); // use contained exception, if throwable x = tce; if (tce.getexception() != null) { x = tce.getexception(); } x.printstacktrace(); } catch (transformerexception te) { // error generated parser system.out.println("\n** transformation error"); system.out.println(" " + te.getmessage()); // use contained exception, if throwable x = te; if (te.getexception() != null) { x = te.getexception(); } x.printstacktrace(); } catch (saxexception sxe) { // error generated application // (or parser-initialization error) exception x = sxe; if (sxe.getexception() != null) { x = sxe.getexception(); } x.printstacktrace(); } catch (parserconfigurationexception pce) { // parser specified options can't built pce.printstacktrace(); } catch (ioexception ioe) { // i/o error ioe.printstacktrace(); } } // main } after modification :
import javax.xml.parsers.documentbuilder; import javax.xml.parsers.documentbuilderfactory; import javax.xml.parsers.factoryconfigurationerror; import javax.xml.parsers.parserconfigurationexception; import org.xml.sax.saxexception; import org.xml.sax.saxparseexception; import org.w3c.dom.document; import org.w3c.dom.domexception; // write operation import javax.xml.transform.transformer; import javax.xml.transform.transformerexception; import javax.xml.transform.transformerfactory; import javax.xml.transform.transformerconfigurationexception; import javax.xml.transform.dom.domsource; import javax.xml.transform.stream.streamsource; import javax.xml.transform.stream.streamresult; import java.io.*; public class stylizer { public static void main(string[] argv) { if (argv.length < 2) { system.err.println("usage: java stylizer stylesheet xmlfile"); system.exit(1); } documentbuilderfactory factory = documentbuilderfactory.newinstance(); //factory.setnamespaceaware(true); //factory.setvalidating(true); try { file stylesheet = new file(argv[0]); file [] filelist = new file[argv.length]; for(int i=1 ; i<argv.length ; i++) filelist[i] = new file(argv[i]); string targetextension = ".xml"; int extindex = argv[0].lastindexof("."); string ext = argv[0].substring(extindex); argv[0] = argv[0].substring(0, extindex) + targetextension; file outputname = new file(argv[0]); documentbuilder builder = factory.newdocumentbuilder(); document [] document = new document[argv.length]; for(int i=1 ; i<argv.length ; i++) document[i] = builder.parse(filelist[i]); // use transformer output transformerfactory tfactory = transformerfactory.newinstance(); streamsource stylesource = new streamsource(stylesheet); transformer transformer = tfactory.newtransformer(stylesource); domsource [] source = new domsource [argv.length]; for(int i=1 ; i<argv.length ; i++) source[i] = new domsource(document[i]); fileoutputstream outputstream = new fileoutputstream((file)outputname); streamresult result = new streamresult(outputstream); for(int i=1 ; i<argv.length ; i++) transformer.transform(source[i], result); } catch (transformerconfigurationexception tce) { // error generated parser system.out.println("\n** transformer factory error"); system.out.println(" " + tce.getmessage()); // use contained exception, if throwable x = tce; if (tce.getexception() != null) { x = tce.getexception(); } x.printstacktrace(); } catch (transformerexception te) { // error generated parser system.out.println("\n** transformation error"); system.out.println(" " + te.getmessage()); // use contained exception, if throwable x = te; if (te.getexception() != null) { x = te.getexception(); } x.printstacktrace(); } catch (saxexception sxe) { // error generated application // (or parser-initialization error) exception x = sxe; if (sxe.getexception() != null) { x = sxe.getexception(); } x.printstacktrace(); } catch (parserconfigurationexception pce) { // parser specified options can't built pce.printstacktrace(); } catch (ioexception ioe) { // i/o error ioe.printstacktrace(); } } // main }
you create new file outputname changing name of stylesheet file end in .xml.
you use file new fileoutputstream called outputstream.
then use output stream new streamresult called result.
finally transform each of source xml files using same result stream.
the transformer doing have told it: transforming each dom source independently , putting results of each 1 in same place.
it's not clear expect. want output combined single xml document somehow? if must how want them combined.
are using 4 command-line xml files as well other 2 xml files in document calls in xslt stylesheet? 6 xml files combined 1 awful lot!
if want 4 independent transforms have create 4 different output files , send output of each transform different place.
Comments
Post a Comment