RE: [xsl] Extracting element name and value as separate

Subject: RE: [xsl] Extracting element name and value as separate
From: "W Charlton" <XSLList@xxxxxxxxxx>
Date: Fri, 16 Feb 2007 12:54:52 -0000
Srinivasan,

If you have any control over the XML format it may help to decide whether to
use attributes or elements.

As a quick fix you can use //@ to select all child attributes. It's a bit
blunt but it works.

Your XML is.

<state_results state_name="Atlantic Canada" state_id="AC">
	<game_results game_name="Lotto 6/49" game_id="201">
		<date>
			<abbr_date>02/03/07</abbr_date>
			<full_date>02/03/2007</full_date>
		</date>
		<number_str>10-13-24-27-37-39, Bonus: 14</number_str>
		<numbers>
			<number>10</number>
			<number>13</number>
		</numbers>
		<bonus>
			<bonus_name>Bonus</bonus_name>
			<bonus_number>14</bonus_number>
		</bonus>
		<next_date>
			<next_abbr_date>02/07/07</next_abbr_date>
			<next_full_date>02/07/2007</next_full_date>
		</next_date>
	</game_results>
	<requested_action>ADD</requested_action>
</state_results>

It have repeated it here because it is easier to see the format.
For test purposes I have:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
version="1.0">
	<xsl:template match="state_results">
		<table border="1">
			<tbody>
				<tr>
					<th>name</th>
					<th>value</th>
				</tr>
				<xsl:for-each select="//@*">
					<tr>
						<td>
							<xsl:value-of
select="name()"/>
						</td>
						<td>
							<xsl:value-of
select="."/>
						</td>
					</tr>
				</xsl:for-each>
			</tbody>
		</table>
		Desired output
		
			<table border="1">
			<tbody>
				<tr>
					<th>name</th>
					<th>value</th>
				</tr>
				<tr>
					<td>state_name</td>
					<td>Atlantic Canada</td>
				</tr>
				<tr>
					<td>state_id</td>
					<td>AC</td>
				</tr>
				<tr>
					<td>game_name</td>
					<td>Lotto 6/49</td>
				</tr>
				<tr>
					<td>game_id</td>
					<td>201</td>
				</tr>
				<tr>
					<td>abbr_date</td>
					<td>02/03/07</td>
				</tr>
				<tr>
					<td>full_date</td>
					<td>02/03/2007</td>
				</tr>
				<tr>
					<td>number_str</td>
					<td>10-13-24-27-37-39, Bonus:
14</td>
				</tr>
				<tr>
					<td>next_abbr_date</td>
					<td>02/07/07</td>
				</tr>
			</tbody>
		</table>
	</xsl:template>
</xsl:stylesheet>

As you can see the child of child elements are not matched.

If you can change the elements to attributes like:
<date abbr_date="02/03/07" full_date="02/03/2007"/>

Then you will find it works.


William Charlton
The yMonda team
yMonda Limited
w: www.ymonda.net


-----Original Message-----
From: Thangavelu Srinivasan [mailto:vasantry@xxxxxxxxx] 
Sent: 2007 February 16 12:20
To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
Subject: [xsl] Extracting element name and value as separate

Hi Folks

I am using xslt 1.0. I am facing the problem in extracting the element
name and value separately. Any suggestions are welcome

Sample XML:

<state_results state_name="Atlantic Canada" state_id="AC">
- <game_results game_name="Lotto 6/49" game_id="201">
- <date>
  <abbr_date>02/03/07</abbr_date>
  <full_date>02/03/2007</full_date>
  </date>
  <number_str>10-13-24-27-37-39, Bonus: 14</number_str>
- <numbers>
  <number>10</number>
  <number>13</number>
  </numbers>
- <bonus>
  <bonus_name>Bonus</bonus_name>
  <bonus_number>14</bonus_number>
  </bonus>
- <next_date>
  <next_abbr_date>02/07/07</next_abbr_date>
  <next_full_date>02/07/2007</next_full_date>
  </next_date>
  </game_results>
  <requested_action>ADD</requested_action>
  </state_results>

My XSL:
<xsl:stylesheetxmlns:xsl="http://www.w3.org/1999/XSL/Transform";
version="1.0">
<xsl:template match="state_results">
<xsl:for-each select="@*">
<Name><xsl:value-of select="name()"/></Name>
<Value><xsl:value-of select="."/></Value>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

Required Output :

<Name>state_name</Name>
<Value>Atlantic Canada</Value>
<Name>state_id</Name>
<Value>AC</Value>
<Name>game_name</Name>
<Value>Lotto 6/49</Value>
<Name>game_id</Name>
<Value>201</Value>
<Name>abbr_date</Name>
<Value>02/03/07</Value>
<Name>full_date</Name>
<Value>02/03/2007</Value>
<Name>number_str</Name>
<Value>10-13-24-27-37-39, Bonus: 14</Value>
<Name>next_abbr_date</Name>
<Value>02/07/07</Value>

I am not able to get desired output.

Regards
Srinivas

Current Thread