xsl-list
[Top] [All Lists]

Re: [xsl] Comparing attributes and setting the values

2014-08-19 03:33:37
Thanks a lot Michael! :)

I checked with another xslt processor. It worked.
I have added bit of complication here. I am not trying to merge two xml
files on the basis of same condition with the same logic. The first xml
file is same as above:

File1.xml
File.xml:
<?xml version="1.0"?>
<Move-Afile>
  <Afile>
    <Item>
      <PackNumber level="1">1234</PackNumber>
    </Item>
    <Item>
      <PackNumber level="1">567</PackNumber>
    </Item>
    <Item>
      <PackNumber level="4">5672</PackNumber>
    </Item>
    <Item>
      <PackNumber level="5">126</PackNumber>
    </Item>
    <Item>
      <PackNumber level="7">876</PackNumber>
    </Item>
  </Afile>
</Move-Afile>

The second file looks like this
File2.xml
<?xml version="1.0"?>
<Move-Afile>
  <Afile>
    <Item>
      <PackNumber level="12">222</PackNumber>
    </Item>
    <Item>
      <PackNumber level="12">333</PackNumber>
    </Item>
    <Item>
      <PackNumber level="14">444</PackNumber>
    </Item>
    <Item>
      <PackNumber level="15">555</PackNumber>
    </Item>
    <Item>
      <PackNumber level="15">666</PackNumber>
    </Item>
  </Afile>
</Move-Afile>

The xslt rule I have written is:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="
http://www.w3.org/1999/XSL/Transform";>
 <xsl:output indent="yes"/>

 <xsl:template match="@*|node()">
            <xsl:copy>
                <xsl:apply-templates select="@*|node()"/>
            </xsl:copy>
        </xsl:template>

        <xsl:template match="text()" />

        <xsl:template match="PackNumber/@level">
        <xsl:choose>
        <xsl:when test="not(preceding::PackNumber/@level =.)">
        <xsl:element name="counter">
        <xsl:attribute name="level">
        <xsl:value-of
select="count(preceding::PackNumber/@level[not(preceding::PackNumber/@level=
.)])+1"/>
        </xsl:attribute>
        </xsl:element>
        </xsl:when>
        <xsl:otherwise>
        <xsl:element name="counter">
        <xsl:attribute name="level">
        <xsl:value-of
select="count(preceding::PackNumber/@level[not(preceding::PackNumber/@level=
.)])"/>
        </xsl:attribute>
        </xsl:element>
        </xsl:otherwise>
        </xsl:choose>

             <PNumber>
                <xsl:value-of select="."/>
            </PNumber>
        </xsl:template>

    <xsl:template match="/">
        <A>
            <target>
                <xsl:apply-templates select="//Item"/>
                <xsl:apply-templates
select="document('File2.xml')/*//Item"/>
            </target>
        </A>
    </xsl:template>
</xsl:stylesheet>


Output should look like this:
<?xml version="1.0"?>
<A>
  <target>
    <Item>
      <PackNumber>
        <counter level="1"/>
        <PNumber>1</PNumber>
      </PackNumber>
    </Item>
    <Item>
      <PackNumber>
        <counter level="1"/>
        <PNumber>1</PNumber>
      </PackNumber>
    </Item>
    <Item>
      <PackNumber>
        <counter level="2"/>
        <PNumber>4</PNumber>
      </PackNumber>
    </Item>
    <Item>
      <PackNumber>
        <counter level="3"/>
        <PNumber>5</PNumber>
      </PackNumber>
    </Item>
    <Item>
      <PackNumber>
        <counter level="4"/>
        <PNumber>7</PNumber>
      </PackNumber>
    </Item>
    <Item>
      <PackNumber>
        <counter level="5"/>
        <PNumber>12</PNumber>
      </PackNumber>
    </Item>
    <Item>
      <PackNumber>
        <counter level="5"/>
        <PNumber>12</PNumber>
      </PackNumber>
    </Item>
    <Item>
      <PackNumber>
        <counter level="5"/>
        <PNumber>14</PNumber>
      </PackNumber>
    </Item>
    <Item>
      <PackNumber>
        <counter level="6"/>
        <PNumber>15</PNumber>
      </PackNumber>
    </Item>
    <Item>
      <PackNumber>
        <counter level="6"/>
        <PNumber>15</PNumber>
      </PackNumber>
    </Item>
  </target>
</A>

But it is not coming this way. It starts from 1 again for the second file.
I want to be sequential.
What can I do for that?

BR,
Varun


On Mon, Aug 18, 2014 at 4:42 PM, Michael Müller-Hillebrand 
mmh(_at_)docufy(_dot_)de <
xsl-list-service(_at_)lists(_dot_)mulberrytech(_dot_)com> wrote:

Hi Varun,

I just copied your source files into the Sandbox of Kernow for Saxon and
got the result you describe as desired.

So I assume your XSLT processor may not work correctly?

- Michael

Am 18.08.2014 um 15:36 schrieb varun bhatnagar 
varun292006(_at_)gmail(_dot_)com <
xsl-list-service(_at_)lists(_dot_)mulberrytech(_dot_)com>:

This gives me the value of levels as 1, 1, 1, 2, 3. But the actual result
should be 1, 1, 2, 3, 4 (as given in output.xml).
Can anyone tell me what am I missing here. I came across an example on
internet but that also didn't help.



  XSL-List info and archive <http://www.mulberrytech.com/xsl/xsl-list>
EasyUnsubscribe <-list/2562907> (by
email <>)

--~----------------------------------------------------------------
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
EasyUnsubscribe: http://lists.mulberrytech.com/unsub/xsl-list/1167547
or by email: xsl-list-unsub(_at_)lists(_dot_)mulberrytech(_dot_)com
--~--
<Prev in Thread] Current Thread [Next in Thread>