Subject: Re: [xsl] Help with transforming unique set of data in XSLT 2.0 From: Jack Bush <netbeansfan@xxxxxxxxxxxx> Date: Thu, 29 Jul 2010 01:40:21 -0700 (PDT) |
Hi Michael, Thank you for identifying the issue which was caused by an iteration loop which invoked the transformation twice. The purpose of this iteration was to pass each secondary file found to the above stylesheet which has a side effect of looping too many times. Instead, I would like to build an arraylist of secondary files before passing over to the same stylesheet to carry out a single transformation such as the following but not clear how XSLT could process it: Transformer transformer = transformerFactory.newTransformer(new StreamSource(masterdox1StyleSheetBrIn)); secondaryArrayList.add("file:///E:/fileA.xml"); secondaryArrayList.add("file:///E:/fileB.xml"); secondaryArrayList.add("file:///E:/fileC.xml"); secondaryArrayList.add("file:///E:/fileD.xml"); transformer.setParameter("LIST_OF_FILE_PARAM", secondaryArrayList); The stylesheet would look something like: <?xml version="1.0"?> <!-- masterdox1.xsl --> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html"/> <xsl:param name="LIST_OF_FILE_PARAM" /> <xsl:template match="/"> <xsl:for-each select="."> </xsl:for-each> </xsl:template> </xsl:stylesheet> All I wanted for now is to iterate through each file so they could be passed to document(). Saxon documentation gave the following explanation: If the returned value is an instance of the Java class java.util.Collection, or if it is an array, the XPath value will be the sequence represented by the contents of this Collection or array. The members of the collection or array will each be converted to an XPath value, as if each member was supplied from a separate function call. An error is reported if the result contains a list or array nested within another list or array. The contents of the list or array are copied immediately on return from the function, so the original List or array object itself may be safely re-used. But I am not clear how this could be achieved on the XSLT side. Thanks again, Jack ----- Original Message ---- From: Michael Kay <mike@xxxxxxxxxxxx> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx Sent: Tue, 27 July, 2010 6:05:33 PM Subject: Re: [xsl] Help with transforming unique set of data in XSLT 2.0 On 27/07/2010 08:29, Jack Bush wrote: > Hi All, > > I am having difficulty get the following stylesheet to transform unique set of > data once: > > The fact that your output shows two XML declarations suggests that there is something wrong with the way you are running the transformation or displaying the results. There's no way the XSLT code you have shown will produce two separate result documents, each with its own XML declaration. Incidentally, the argument to document() should be a URI, not a Windows filename. Many processors let you get away with this error, but there's nothing in the language spec to encourage this and it won't work with all processors. Michael Kay Saxonica > The following output generated duplicated set of identical transformed data >when > using<xsl:for-each>: > > <?xml version="1.0" encoding="UTF-8"?> > <employee> > <first_name>John</first_name> > <surname>smith</surname> > <sex>M</sex> > <first_name>Kelly</first_name> > <surname>Jones</surname> > <sex>F</sex> > </employee> > > <?xml version="1.0" encoding="UTF-8"?> > <employee> > <first_name>John</first_name> > <surname>smith</surname> > <sex>M</sex> > <first_name>Kelly</first_name> > <surname>Jones</surname> > <sex>F</sex> > </employee> > > I tried the following changes after suspecting that the cause was from the > <xsl:for-each> statement: > > 1<xsl:template match="/"> > 2<xsl:apply-templates select="document('E:/employee.xml')/ns:html"/> > 3</xsl:template> > 4 > 5<xsl:template match="ns:html"> > 6<employee> > 7<xsl:variable name="employee_data" >select="ns:body/ns:div[@id='content']/ns:table[@class='sresults']/ns:tr/ns:t d/ns:a"/> >> > > 8<xsl:apply-templates select="$employee_data"/> > 9<first_name><xsl:value-of > select="substring-before(@title,',')"/></first_name> > 10<surname><xsl:value-of select="@href"/></surname> > 11<sex><xsl:value-of select="@gender"/></sex> > 12</employee> > 13</xsl:template> > > Below is the output without using<xsl:for-each>: > > <?xml version="1.0" encoding="UTF-8"?> > <employee> > John Kelly > <firstname /> > <surname /> > <sex/>> > </employee> > > <?xml version="1.0" encoding="UTF-8"?> > <employee> > John Kelly > <firstname /> > <surname /> > <sex/>> > </employee> > > Any ideas on what is causing the duplications and why is the second stylesheet > picking up the firstnames of 2 separate xml documents in the wrong place? > > The desire output is just a single entry of each record such as the following: > > <?xml version="1.0" encoding="UTF-8"?> > <employee> > <first_name>John</first_name> > <surname>smith</surname> > <sex>M</sex> > <first_name>Kelly</first_name> > <surname>Jones</surname> > <sex>F</sex> > </employee> > > Thanks a lot, > > Jack > > > > > > --~------------------------------------------------------------------ > XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list > To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/ > or e-mail:<mailto:xsl-list-unsubscribe@xxxxxxxxxxxxxxxxxxxxxx> > --~--
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] Help with transforming un, Michael Kay | Thread | Re: [xsl] Help with transforming un, Michael Kay |
[xsl] Where in the XPath 2.0 is the, Dimitre Novatchev | Date | Re: [xsl] Wrong encoding value: "Co, Michael Kay |
Month |