xsl-list
[Top] [All Lists]

[xsl] How can I change the attribute value of element

2014-09-01 07:29:52
Hi,

I have 2 xmls. I am trying to merge them on certain condition where, if the
xml file contains <test1> element then the pkg tag should be changed to:
<pkg>
  <test1 val="12345"/>
</pkg>
and then <pkg1> tag should start. But in the output I am getting <pkg> tag
twice. Any suggestion on how can I remove this tag and have only one <pkg>
tag with the required value?

File1.xml
<?xml version="1.0"?>
<Move-Afile>
  <Afile>
    <Item>
      <PackNumber level="1">
      <pkg>
       <test1 val="41"></test1>
      </pkg>
      <pkg1>
       <all/>
      </pkg1>
      </PackNumber>
    </Item>
    <Item>
      <PackNumber level="1">
  <pkg>
       <test1 val="51"></test1>
      </pkg>
      <pkg1>
       <all/>
      </pkg1>
      </PackNumber>
    </Item>
  </Afile>
</Move-Afile>

File2.xml
<?xml version="1.0"?>
<Move-Afile>
  <Afile>
    <Item>
      <PackNumber level="2">
      <pkg>
       <test1 val="12"></test1>
      </pkg>
      <pkg1>
       <all/>
      </pkg1>
      </PackNumber>
    </Item>
    <Item>
      <PackNumber level="2">
  <pkg>
       <test1 val="43"></test1>
      </pkg>
      <pkg1>
       <all/>
      </pkg1>
      </PackNumber>
    </Item>
  </Afile>
</Move-Afile>

Output.xml

<A>
<target>
<Item>
<PackNumber>
<counter level="1"/>
<pkg>
<test1 val="12345"/>
</pkg>

<pkg1>
<all/>
</pkg1>
</PackNumber>
</Item>
<Item>
<PackNumber>
<counter level="1"/>
<pkg>
<test1 val="12345"/>
</pkg>

<pkg1>
<all/>
</pkg1>
</PackNumber>
</Item>
<Item>
<PackNumber>
<counter level="2"/>
<pkg>
<test1 val="12345"/>
</pkg>
<pkg>
<test1 val="12"/>
</pkg>
</PackNumber>
</Item>
<Item>
<PackNumber>
<counter level="2"/>
<pkg>
<test1 val="12345"/>
</pkg>
<pkg>
<test1 val="43"/>
</pkg>
</PackNumber>
</Item>
</target>
</A>

Rules.xsl
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
xmlns:exsl="http://exslt.org/common"; exclude-result-prefixes="exsl"
version="2.0">
<xsl:output indent="yes" omit-xml-declaration="yes"/>
<xsl:template match="@*|node()" mode="step2">
<xsl:copy>
<xsl:apply-templates select="@*|node()" mode="step2"/>
</xsl:copy>
</xsl:template>


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

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

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

<xsl:template match="Item" mode="step1">
<xsl:copy-of select="."/>
</xsl:template>

<!--
<xsl:template match="//test1/@val">
<xsl:value-of select="1234"></xsl:value-of>
</xsl:template>
 -->
<xsl:template match="PackNumber/@level" mode="step3">
<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>
<xsl:text>&#xA;</xsl:text>
<pkg>
<xsl:text>&#xA;</xsl:text>
       <test1 val="12345"/>
       <xsl:text>&#xA;</xsl:text>
     </pkg>
     <xsl:apply-templates select="//pkg1"></xsl:apply-templates>
</xsl:template>

<!-- <xsl:template match="//pkg"></xsl:template>  -->

<xsl:template match="PackNumber/@level" mode="step2">
<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>
</xsl:template>

<xsl:template match="/">
<xsl:variable name="union">
<xsl:apply-templates select="//Item" mode="step1"/>
<xsl:apply-templates select="document('stackoverflow2.xml')/*//Item"
mode="step1"/>
</xsl:variable>
<A>
<target>
<xsl:choose>
<xsl:when test="exsl:node-set($union)/*/descendant::test">
<xsl:apply-templates select="exsl:node-set($union)/*" mode="step2"/>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="exsl:node-set($union)/*" mode="step3"/>
</xsl:otherwise>
</xsl:choose>
</target>
</A>
</xsl:template>
</xsl:stylesheet>

BR,
Varun
--~----------------------------------------------------------------
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>