[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message]

Re: Replacing the element's attribute in sequential o

Subject: Re: Replacing the element's attribute in sequential orderin
From: "Michael Reed michaelr@xxxxxxxxxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Date: Sun, 3 Aug 2014 14:08:56 -0000
Re:  Replacing the element's attribute in sequential  o
Sent from my iPhonereed2j

On Aug 1, 2014, at 4:33 AM, Ihe Onwuka
<ihe.onwuka@xxxxxxxxx<mailto:ihe.onwuka@xxxxxxxxx>> wrote:j

http://www.dpawson.co.uk/xsl/sect2/N1553.html#d2256e169


On Fri, Aug 1, 2014 at 10:29 AM, varun bhatnagar
varun292006@xxxxxxxxx<mailto:varun292006@xxxxxxxxx>
<xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx<mailto:xsl-list-service@xxxxxxxxxxxx
rytech.com>> 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 filesljp
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 &gt; 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<mailto:martin.honnen@xxxxxx>
<xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx<mailto:xsl-list-service@xxxxxxxxxxxx
rytech.com>> wrote:
varun bhatnagar varun292006@xxxxxxxxx<mailto: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

PURCHASE STYLUS STUDIO ONLINE TODAY!

Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!

Buy Stylus Studio Now

Download The World's Best XML IDE!

Accelerate XML development with our award-winning XML IDE - Download a free trial today!

Don't miss another message! Subscribe to this list today.
Email
First Name
Last Name
Company
Subscribe in XML format
RSS 2.0
Atom 0.3
Site Map | Privacy Policy | Terms of Use | Trademarks
Free Stylus Studio XML Training:
W3C Member
Stylus Studio® and DataDirect XQuery ™are products from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2013 All Rights Reserved.