How to transform XML attributes values into XML elements?

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • sershat
    New Member
    • Sep 2017
    • 1

    How to transform XML attributes values into XML elements?

    Platform: Informatica 9.6.1 (XML parcer).

    I have a generic XML source file where column names (element names) are stored as attribute (AttributeID) values. I need to write XSLT file and Java code to convert attributes (AttributeID) values into the element (Column_1, Column_2, etc.) and elements values so it can be correctly read by Informatica XML parser. I am new to XSLT.

    Here is the sample of the XML source file:
    Code:
    <?xml version="1.0" encoding="utf-8"?>
    <Products ExportTime="2017-08-21 11:24:43" ExportContext="Context1" ContextID="Context1" WorkspaceID="Main" UseContextLocale="false">
    	<Product Product_ID="1000">
    		<Entities>
    			<Entity Entity_ID="100" UserTypeID="SourceRecord1" ParentID="Source Records10" Selected="false1" Referenced="true1">
    			<Name>Name_1</Name>
    				<Values>
    					<Value AttributeID="Column_1">Value_1</Value>
    					<Value AttributeID="Column_2">Value_2</Value>
    					<Value AttributeID="Column_3" Column_4="Value_4">Value_3</Value>
    				</Values>
    			</Entity>
    			<Entity Entity_ID="101" UserTypeID="SourceRecord2" ParentID="Source Records20" Selected="false2" Referenced="true2">
    			<Name>Name_2</Name>
    				<Values>
    					<Value AttributeID="Column_1">Value_5</Value>
    					<Value AttributeID="Column_2">Value_6</Value>
    					<Value AttributeID="Column_3" Column_4="Value_8">Value_7</Value>
    				</Values>
    			</Entity>
    		</Entities>
    	</Product>
    	<Product Product_ID="1001">
    		<Entities>
    			<Entity Entity_ID="102" UserTypeID="SourceRecord3" ParentID="Source Records30" Selected="false3" Referenced="true3">
    			<Name>Name_3</Name>
    				<Values>
    					<Value AttributeID="Column_1">Value_9</Value>
    					<Value AttributeID="Column_2">Value_10</Value>
    					<Value AttributeID="Column_3" Column_4="Value_12">Value_11</Value>
    				</Values>
    			</Entity>
    			<Entity Entity_ID="103" UserTypeID="SourceRecord4" ParentID="Source Records40" Selected="false4" Referenced="true4">
    			<Name>Name_4</Name>
    				<Values>
    					<Value AttributeID="Column_1">Value_13</Value>
    					<Value AttributeID="Column_2">Value_14</Value>
    					<Value AttributeID="Column_3" Column_4="Value_16">Value_15</Value>
    				</Values>
    			</Entity>
    		</Entities>
    	</Product>
    </Products>
    I have to transform this file into the normally formed one (with elements and their value primarily):

    Code:
    <?xml version="1.0" encoding="utf-8"?>
    <Products ExportTime="2017-08-21 11:24:43" ExportContext="Context1" ContextID="Context1" WorkspaceID="Main" UseContextLocale="false">
    	<Product Product_ID="1000">
    		<Entities>
    			<Entity Entity_ID="100" UserTypeID="SourceRecord" ParentID="Source Records" Selected="false" Referenced="true">
    				<Name>Name_1</Name>
    				<Item ItemID="1238240">
    					<Column_1>Value_1</Column_1>
    					<Column_2>Value_2</Column_2>
    					<Column_3>Value_3</Column_3>
    					<Column_4>Value_4</Column_4>
    				</Item>
    			</Entity>
    			<Entity Entity_ID="101" UserTypeID="SourceRecord" ParentID="Source Records" Selected="false" Referenced="true">
    				<Name>Name_2</Name>
    				<Item>
    					<Column_1>Value_5</Column_1>
    					<Column_2>Value_6</Column_2>
    					<Column_3>Value_7</Column_3>
    					<Column_4>Value_8</Column_4>
    				</Item>
    			</Entity>
    		</Entities>
    	</Product>
    	<Product Product_ID="1001">
    		<Entities>
    			<Entity Entity_ID="102" UserTypeID="SourceRecord" ParentID="Source Records" Selected="false" Referenced="true">
    				<Name>Name_3</Name>
    				<Item ItemID="1238240">
    					<Column_1>Value_9</Column_1>
    					<Column_2>Value_10</Column_2>
    					<Column_3>Value_11</Column_3>
    					<Column_4>Value_12</Column_4>
    				</Item>
    			</Entity>
    			<Entity Entity_ID="103" UserTypeID="SourceRecord" ParentID="Source Records" Selected="false" Referenced="true">
    				<Name>Name_4</Name>
    				<Item>
    					<Column_1>Value_13</Column_1>
    					<Column_2>Value_14</Column_2>
    					<Column_3>Value_15</Column_3>
    					<Column_4>Value_16</Column_4>
    				</Item>
    			</Entity>
    		</Entities>
    	</Product>
    </Products>
    Thank you for any help with XSLT code or hits in advance!
    Last edited by Frinavale; Sep 22 '17, 01:07 PM.
  • Luuk
    Recognized Expert Top Contributor
    • Mar 2012
    • 1043

    #2
    Xmlstarlet is a tool which can create a XLST-stylesheets, see example below.
    It can help in getting to know more about XSLT in a do-it-yourself manner ;)

    From the website (http://xmlstar.sourceforge.net) :
    [QUOOT]XMLStarlet is a set of command line utilities (tools) which can be used to transform, query, validate, and edit XML documents and files using simple set of shell commands[/QUOOT]


    Code:
    C:\temp>xml sel -t -v //Name  source.xml
    Name_1
    Name_2
    Name_3
    Name_4
    C:\temp>xml sel -C -t -v //Name  source.xml
    <?xml version="1.0"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exslt="http://exslt.org/common" version="1.0" extension-element-prefixes="exslt">
      <xsl:output omit-xml-declaration="yes" indent="no"/>
      <xsl:template match="/">
        <xsl:call-template name="value-of-template">
          <xsl:with-param name="select" select="//Name"/>
        </xsl:call-template>
      </xsl:template>
      <xsl:template name="value-of-template">
        <xsl:param name="select"/>
        <xsl:value-of select="$select"/>
        <xsl:for-each select="exslt:node-set($select)[position()&gt;1]">
          <xsl:value-of select="'
    '"/>
          <xsl:value-of select="."/>
        </xsl:for-each>
      </xsl:template>
    </xsl:stylesheet>

    Comment

    Working...