| Author | Message | 
		
		  | Bingo | 
			  
				|  Posted: Wed May 18, 2005 7:06 pm    Post subject: DIRECT REFERENCING TO XML ATTRIBUTE |   |  | 
		
		  | Novice
 
 
 Joined: 31 Mar 2005Posts: 22
 
 
 | 
			  
				| Hi , 
 I have to create an XML in the following format.
 
 <Root>
 <Benefit>
 <Profit type="one">
 <Cash>CashBonusOptionCode</Cash>
 </Benefit>
 <Benefit>
 <Profit type="two">
 <EndDate>2001-01-01</EndDate>
 </Benefit>
 </Root>
 
 What E-SQL code should i use so that the following XML is created ? I want to use REFERencing ........
 
 I have been trying to do referencing to the XML attribute <Profit type="one">, but not been able to do so. Is it at all posiible in MB to reference it this way ?
 
 The Benefit is a repeating element in the XML.
 
 Please advise.
 |  | 
		
		  | Back to top |  | 
		
		  |  | 
		
		  | Bingo | 
			  
				|  Posted: Wed May 18, 2005 7:09 pm    Post subject: Correcton |   |  | 
		
		  | Novice
 
 
 Joined: 31 Mar 2005Posts: 22
 
 
 | 
			  
				| The sample is actually like the one below: 
 <Root>
 <Profit type="one">
 <Cash>CashBonusOptionCode</Cash>
 </Profit>
 </Benefit>
 <Profit type="two">
 <EndDate>2001-01-01</EndDate>
 </Profit>
 </Benefit>
 </Root>
 |  | 
		
		  | Back to top |  | 
		
		  |  | 
		
		  | jefflowrey | 
			  
				|  Posted: Thu May 19, 2005 2:04 am    Post subject: |   |  | 
		
		  | Grand Poobah
 
 
 Joined: 16 Oct 2002Posts: 19981
 
 
 | 
			  
				| The various keywords used to reference different types of XML data (elements, attributes, etc) are all clearly spelled out in the documentation. 
 And the REFERENCE keyword is also documented, and pretty well - particularly in the section on Referencing Anonymous Fields.
 _________________
 I am *not* the model of the modern major general.
 |  | 
		
		  | Back to top |  | 
		
		  |  | 
		
		  | Bingo | 
			  
				|  Posted: Mon May 23, 2005 9:23 am    Post subject: Hello - Still need help |   |  | 
		
		  | Novice
 
 
 Joined: 31 Mar 2005Posts: 22
 
 
 | 
			  
				| Hello Jeff, 
 I am still struggling with this one. I have explained the complete scenario below. Please help.
 
 Input XML
 ==========
 
 <Message>
 <E1>
 <E11>
 <E12>
 <B>Data type = 'one'</B>
 <C>TEST1</C>
 <D>TEST4</D>
 </E12>
 </E11>
 </E1>
 <E1>
 <E11>
 <E12>
 <B>Data1 type = 'two'</B>
 <C>TEST2</C>
 <D>TEST3</D>
 </E12>
 </E11>
 </E1>
 </Message>
 
 What I am trying to do is to reference the attribute of the element <B> which is  type = 'one'
 and store it in some variable like below:
 
 
 DECLARE myref REFERENCE TO InputRoot.MRM.Message.E1.E11.E12.B;
 
 With this reference i can access two elements basically :
 
 1. <B>Data type = 'one'</B>
 2. <B>Data1 type = 'two'</B>
 
 What i want to do is access these attributes through referencing and try to map it to output like the
 following: For example store the reference to the attribute type = 'one' and do mapping as below.
 
 IF myref.type = 'one' THEN
 
 SET OutputRoot.MRM.TestOut.test = myref.C; (trying to map value TEST1)
 SET OutputRoot.MRM.TestOut.test1 = myref.D;(trying to map value TEST4)
 
 This code does not work as i have one more element under that reference. I want to know how can i store
 the reference of an XML element's attribute so that i can do the mapping as explained above.One more thing, I
 donot know how many such elements as <B>Data1 type = 'two'</B> can occur...so there occurance is dynamic.
 
 Cardinality is an option, but how do i ensure that i am doing the mapping from the correct input element.Please help.
 |  | 
		
		  | Back to top |  | 
		
		  |  | 
		
		  | Bingo | 
			  
				|  Posted: Mon May 23, 2005 9:39 am    Post subject: Correction in XML |   |  | 
		
		  | Novice
 
 
 Joined: 31 Mar 2005Posts: 22
 
 
 | 
			  
				| Actual XML looks like the follwoing..sorry for inconvenience. 
 Input XML
 ==========
 
 <Message>
 <E1>
 <E11>
 <E12>
 <B>Data type = 'one'
 <C>TEST1</C>
 <D>TEST4</D>
 </B>
 </E12>
 </E11>
 </E1>
 <E1>
 <E11>
 <E12>
 <B>Data1 type = 'two'
 <C>TEST2</C>
 <D>TEST3</D>
 </B>
 </E12>
 </E11>
 </E1>
 </Message>
 |  | 
		
		  | Back to top |  | 
		
		  |  | 
		
		  | jefflowrey | 
			  
				|  Posted: Mon May 23, 2005 9:46 am    Post subject: |   |  | 
		
		  | Grand Poobah
 
 
 Joined: 16 Oct 2002Posts: 19981
 
 
 | 
			  
				| Everything you need to know to solve this problem is here. _________________
 I am *not* the model of the modern major general.
 |  | 
		
		  | Back to top |  | 
		
		  |  | 
		
		  | Saadat | 
			  
				|  Posted: Wed May 25, 2005 5:14 am    Post subject: |   |  | 
		
		  | Newbie
 
 
 Joined: 16 May 2005Posts: 5
 Location: IBM Greenock, UK
 
 | 
			  
				| Hi there, 
 This may help you to solve your issue.
 
 DECLARE myref REFERENCE TO InputRoot.MRM.Message.E1.E11.E12.B;
 
 IF myref.(XML.Attribute).type = 'one' THEN
 --Your ESQL
 |  | 
		
		  | Back to top |  | 
		
		  |  | 
		
		  | JT | 
			  
				|  Posted: Wed May 25, 2005 10:20 am    Post subject: |   |  | 
		
		  | Padawan
 
 
 Joined: 27 Mar 2003Posts: 1564
 Location: Hartford, CT.
 
 | 
			  
				| 
   
	| Saadat wrote: |  
	| DECLARE myref REFERENCE TO InputRoot.MRM.Message.E1.E11.E12.B; 
 IF myref.(XML.Attribute).type = 'one' THEN
 --Your ESQL
 |  Saadat, your suggestion won't handle the other occurrences of the E1 element, since you don't specify an index for the E1 element.
 
 
 
   
	| Bingo wrote: |  
	| <Message>
 <E1>
 <E11>
 <E12>
 <B>Data type = 'one'
 <C>TEST1</C>
 <D>TEST4</D>
 </B>
 </E12>
 </E11>
 </E1>
 <E1>
 <E11>
 <E12>
 <B>Data1 type = 'two'
 <C>TEST2</C>
 <D>TEST3</D>
 </B>
 </E12>
 </E11>
 </E1>
 </Message>
 
 |  I could be wrong, but I thought spaces weren't allowed in an attribute name. So, if you remove the space, this code will produce the results you want:
 
 
   
	| Code: |  
	| SET OutputRoot.XML.TestOut.test  = THE(SELECT ITEM T.E11.E12.B.C FROM InputRoot.XML.Message.E1[] AS T WHERE T.E11.E12.B.(XML.attr)* = 'one');
 SET OutputRoot.XML.TestOut.test1 =
 THE(SELECT ITEM T.E11.E12.B.D FROM InputRoot.XML.Message.E1[] AS T WHERE T.E11.E12.B.(XML.attr)* = 'one');
 |  ...or if you want to use REFERENCE datatypes, as you indicated, you could try this:
 
 
   
	| Code: |  
	| DECLARE inref  REFERENCE TO InputRoot.XML.Message.E1[1];
 CREATE FIELD OutputRoot.XML.TestOut;
 DECLARE outref REFERENCE TO OutputRoot.XML.TestOut;
 
 WHILE LASTMOVE(inRef) DO
 IF FIELDVALUE(inRef.E11.E12.B.(XML.attr)*) = 'one'  THEN
 SET outRef.test  = inRef.E11.E12.B.C;
 SET outRef.test1 = inRef.E11.E12.B.D;
 END IF;
 MOVE inRef NEXTSIBLING;
 END WHILE;
 |  |  | 
		
		  | Back to top |  | 
		
		  |  | 
		
		  | Bingo | 
			  
				|  Posted: Thu May 26, 2005 6:35 am    Post subject: Working!!!!! BINGO |   |  | 
		
		  | Novice
 
 
 Joined: 31 Mar 2005Posts: 22
 
 
 | 
			  
				| Hi JT, 
 Thanx for the suggestion...its working . I have also tried to implement the same with While loop and its working. Thanx for all your suggestion.
 
 Regds
 |  | 
		
		  | Back to top |  | 
		
		  |  | 
		
		  |  |