Subject: Re: [xsl] Replacing the element's attribute in sequential order From: "Ihe Onwuka ihe.onwuka@xxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> Date: Fri, 1 Aug 2014 09:33:35 -0000 |
http://www.dpawson.co.uk/xsl/sect2/N1553.html#d2256e169 On Fri, Aug 1, 2014 at 10:29 AM, varun bhatnagar varun292006@xxxxxxxxx < xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote: > Hi, > > Thanks a ton for the reply. > I am using XSLT-1.0 so I don't think for loop will work. I am loading the > file using python code, lxml library does that for me. I pass my files one > by one to the method given below and merge the files. > > def startXSLTMerge(self, mergeFileName, inputFile): > parser = etree.XMLParser() > parser.resolvers.add(FileResolver()) > > xml_input = etree.parse(open(inputFile,'r'), parser) > xslt_root = etree.parse(open(mergeGeneric.xsl','r'), parser) > transform = etree.XSLT(xslt_root) > result = str(transform(xml_input)) > print str(transform(xml_input)) > > f = open('Merged_File.xml', 'w+') > f.write(str(result)) > f.close() > > I was trying something like this (this is not giving me the correct > result, but something which I have tried): > > <xsl:template match="/InfoTag/Procedure"> > <xsl:variable name="countDocProcedures"> > <xsl:value-of select="count(/InfoTag/Procedure)"/> > </xsl:variable> > <xsl:variable name="countProcedures"> > <xsl:value-of > select="count(document('NewFile1.xml')/InfoTag/Procedure)"/> > </xsl:variable> > > <xsl:variable name="totalProcedures"> > <xsl:value-of select="$countDocProcedures + $countProcedures"/> > </xsl:variable> > <xsl:call-template name="callProcedure"> > <xsl:with-param name="test" select="$totalProcedures"/> > </xsl:call-template> > </xsl:template> > <xsl:template name="callProcedure"> > <xsl:param name="test"/> > <xsl:if test="$test > 0"> > <xsl:copy> > <xsl:if test="/InfoTag/Procedure/downTime"> > <xsl:attribute name="attrProc"> > <xsl:value-of select="$test"></xsl:value-of> > </xsl:attribute> > <xsl:attribute name="attrLevel"> > <xsl:value-of select="'##### NOT UNIQUE#####'"></xsl:value-of> > </xsl:attribute> > <xsl:copy-of select="downTime"></xsl:copy-of> > </xsl:if> > </xsl:copy> > <xsl:call-template name="callProcedure"> > <xsl:with-param name="test" select="$test - 1"/> > </xsl:call-template> > </xsl:if> > </xsl:template> > > It is getting '10' in test parameter which I have passed. Still trying to > find out why. > Could you help me. > > > Thanks, > BR, > Varun > > > On Fri, Aug 1, 2014 at 11:19 AM, Martin Honnen martin.honnen@xxxxxx < > xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote: > >> varun bhatnagar varun292006@xxxxxxxxx wrote: >> >>> Hi, >>> >>> I have few xml files (depends on user how much he/she wants to pass). I >>> have to take those files and merge them, so I have created a loop and in >>> that I am passing these files one by one. For this I have written few >>> rules to merge. But there is this <Procedure> tag where I am stuck. To >>> merge this I need to parse each Procedure and have to modify its >>> attributes (attrProc and attrLevel). I have to replace the attrProc >>> attribute with a sequential value and for me this will set a unique >>> "Level" for each Procedure tag and later I will process them based on >>> their level. >>> >>> >>> _File1.xml_ >>> >>> *<?xml version="1.0" encoding="UTF-8"?>* >>> *<InfoTag>* >>> *<Procedure attrProc="TestProcA" attrLevel="1">* >>> * <downTime>* >>> * <acceptableDownTime>* >>> * <all/>* >>> * </acceptableDownTime>* >>> * <downTimePeriod time="600000000"/>* >>> * </downTime>* >>> * </Procedure>* >>> ** >>> * <Procedure attrProc="TestProcB" attrLevel="2">* >>> * <downTime>* >>> * <acceptableDownTime>* >>> * <all/>* >>> * </acceptableDownTime>* >>> * <downTimePeriod time="600000000"/>* >>> * </downTime>* >>> * </Procedure>* >>> *</InfoTag>* >>> >>> >>> _File2.xml_ >>> _ >>> _ >>> *<?xml version="1.0" encoding="UTF-8"?>* >>> *<InfoTag>* >>> *<Procedure attrProc="TestProcC" attrLevel="3">* >>> * <downTime>* >>> * <acceptableDownTime>* >>> * <all/>* >>> * </acceptableDownTime>* >>> * <downTimePeriod time="600000000"/>* >>> * </downTime>* >>> * </Procedure>* >>> ** >>> * <Procedure attrProc="TestProcD" attrLevel="4">* >>> * <downTime>* >>> * <acceptableDownTime>* >>> * <all/>* >>> * </acceptableDownTime>* >>> * <downTimePeriod time="600000000"/>* >>> * </downTime>* >>> * </Procedure>* >>> *</InfoTag>* >>> >>> >>> >>> I am trying to fetch an output file which looks like this: >>> >>> _Output.xml_ >>> >>> *<InfoTag>* >>> *<Procedure attrProc="1" attrLevel="### NOT UNIQUE ###">* >>> * <downTime>* >>> * <acceptableDownTime>* >>> * <all/>* >>> * </acceptableDownTime>* >>> * <downTimePeriod time="600000000"/>* >>> * </downTime>* >>> * </Procedure>* >>> * <Procedure attrProc="2" attrLevel="### NOT UNIQUE ###">* >>> * <downTime>* >>> * <acceptableDownTime>* >>> * <all/>* >>> * </acceptableDownTime>* >>> * <downTimePeriod time="600000000"/>* >>> * </downTime>* >>> * </Procedure>* >>> *<Procedure attrProc="3" attrLevel="### NOT UNIQUE ###">* >>> * <downTime>* >>> * <acceptableDownTime>* >>> * <all/>* >>> * </acceptableDownTime>* >>> * <downTimePeriod time="600000000"/>* >>> * </downTime>* >>> * </Procedure>* >>> * <Procedure attrProc="4" attrLevel="### NOT UNIQUE ###">* >>> * <downTime>* >>> * <acceptableDownTime>* >>> * <all/>* >>> * </acceptableDownTime>* >>> * <downTimePeriod time="600000000"/>* >>> * </downTime>* >>> * </Procedure> * >>> *</InfoTag>* >>> >>> >>> >>> I am thinking of looping it and will count the occurrences of it and >>> then I am thinking to replace the value. But I am not able to do that. >>> Can anyone tell me how to achieve this. How can I loop every Procedure >>> tag and and append the attrProc attribute value in a sequential order? >>> >> >> How do you load the files? >> >> I would simply use Saxon 9 and collection, as in >> >> <xsl:template match="/" name="main"> >> <InfoTag> >> <xsl:apply-templates select="collection('.?select=* >> .xml')//Procedure"/> >> </InfoTag> >> </xsl:template> >> >> <xsl:template match="Procedure"> >> <Procedure attrProc="{position()}" attrLevel="### NOT UNIQUE ###"> >> <xsl:apply-templates/> >> </Procedure> >> </xsl:template> >> >> maybe with an additional <xsl:sort select="@attrLevel"/> on the >> apply-templates of the collection, depending on which ordering you need. If >> the name of the files are known then you can of course also do >> >> <xsl:template match="/" name="main"> >> <InfoTag> >> <xsl:apply-templates select="for $file in (doc('file1.xml'), >> doc('file2.xml')) return $file//Procedure"/> >> </InfoTag> >> </xsl:template> >> >> <xsl:template match="Procedure"> >> <Procedure attrProc="{position()}" attrLevel="### NOT UNIQUE ###"> >> <xsl:apply-templates/> >> </Procedure> >> </xsl:template> >> >> > XSL-List info and archive <http://www.mulberrytech.com/xsl/xsl-list> > EasyUnsubscribe <-list/1005724> (by > email <>)
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] Replacing the element's a, varun bhatnagar varu | Thread | Re: [xsl] Replacing the element's a, Marc marc.liste@xxxx |
Re: [xsl] Replacing the element's a, varun bhatnagar varu | Date | Re: [xsl] Replacing the element's a, Marc marc.liste@xxxx |
Month |