Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read this important communication.
View | Details | Raw Unified | Return to bug 276134 | Differences between
and this patch

Collapse All | Expand All

(-)src/org/eclipse/wst/xml/xpath2/processor/test/AbstractPsychoPathTest.java (-4 / +159 lines)
Lines 7-17 Link Here
7
 * 
7
 * 
8
 * Contributors:
8
 * Contributors:
9
 *     David Carver (STAR) - initial API and implementation
9
 *     David Carver (STAR) - initial API and implementation
10
 *     Jin Mingjan - bug 262765 -  extractXPathExpression and getExpectedResults
11
 *     Mukul Gandhi - bug 273760 - wrong namespace for functions and data types
12
 *     Mukul Gandhi - bug 276134 - improvements to schema aware support for attribute nodes
10
 *******************************************************************************/
13
 *******************************************************************************/
11
package org.eclipse.wst.xml.xpath2.processor.test;
14
package org.eclipse.wst.xml.xpath2.processor.test;
12
15
16
17
13
import java.io.*;
18
import java.io.*;
14
import java.net.URL;
19
import java.net.URL;
20
import java.util.HashMap;
21
import java.util.Iterator;
22
import java.util.regex.Matcher;
23
import java.util.regex.Pattern;
24
25
import javax.xml.XMLConstants;
26
import javax.xml.transform.stream.StreamSource;
27
import javax.xml.validation.Schema;
28
import javax.xml.validation.SchemaFactory;
15
29
16
import org.apache.xerces.xs.ElementPSVI;
30
import org.apache.xerces.xs.ElementPSVI;
17
import org.apache.xerces.xs.XSModel;
31
import org.apache.xerces.xs.XSModel;
Lines 19-27 Link Here
19
import org.eclipse.wst.xml.xpath2.processor.*;
33
import org.eclipse.wst.xml.xpath2.processor.*;
20
import org.eclipse.wst.xml.xpath2.processor.ast.*;
34
import org.eclipse.wst.xml.xpath2.processor.ast.*;
21
import org.eclipse.wst.xml.xpath2.processor.function.*;
35
import org.eclipse.wst.xml.xpath2.processor.function.*;
22
import org.eclipse.wst.xml.xpath2.processor.internal.function.XDTCtrLibrary;
36
import org.eclipse.wst.xml.xpath2.processor.internal.types.AnyType;
37
import org.eclipse.wst.xml.xpath2.processor.internal.types.ElementType;
38
import org.eclipse.wst.xml.xpath2.processor.internal.types.QName;
23
import org.osgi.framework.Bundle;
39
import org.osgi.framework.Bundle;
24
import org.w3c.dom.Document;
40
import org.w3c.dom.Document;
41
import org.xml.sax.SAXException;
25
42
26
import junit.framework.TestCase;
43
import junit.framework.TestCase;
27
44
Lines 29-34 Link Here
29
46
30
	protected Document domDoc = null;
47
	protected Document domDoc = null;
31
	protected Bundle bundle = null;
48
	protected Bundle bundle = null;
49
	
50
	private static final String INPUT_CONTEXT = "input-context";
51
	private static final String INPUT_CONTEXT1 = "input-context1";
52
	private static final String INPUT_CONTEXT2 = "input-context2";
53
//	private static final String S_COMMENT1 = "(:";
54
	private static final String S_COMMENT2 = ":)";
55
	private static final String DECLARE_NAMESPACE = "declare namespace";
56
	private static final String DECLARE_VARIABLE = "declare variable";
57
	private static final String REGEX_DN = "declare namespace\\s+(\\w[-_\\w]*)\\s*=\\s*['\"]([^;]*)['\"];";
58
	private static HashMap<String, String> namespaceMap = new HashMap<String, String>(3);
59
	private static HashMap<String, String> inputMap = new HashMap<String, String>(3);
32
60
33
	@Override
61
	@Override
34
	protected void setUp() throws Exception {
62
	protected void setUp() throws Exception {
Lines 44-49 Link Here
44
		domloader.set_validating(false);
72
		domloader.set_validating(false);
45
		domDoc = domloader.load(is);
73
		domDoc = domloader.load(is);
46
	}
74
	}
75
	
76
	protected void loadDOMDocument(URL fileURL, URL schemaURL) throws IOException,
77
	        DOMLoaderException, SAXException {
78
      InputStream is = fileURL.openStream();
79
      InputStream schemaIs = schemaURL.openStream();
80
      DOMLoader domloader = new XercesLoader(getSchema(schemaIs));
81
      domDoc = domloader.load(is);
82
    }
83
	
84
	private Schema getSchema(InputStream schemaIs) throws SAXException {
85
		SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
86
        Schema schema = sf.newSchema(new StreamSource(schemaIs));
87
        
88
        return schema;
89
	}
47
90
48
	@Override
91
	@Override
49
	protected void tearDown() throws Exception {
92
	protected void tearDown() throws Exception {
Lines 59-70 Link Here
59
102
60
	protected DynamicContext setupDynamicContext(XSModel schema) {
103
	protected DynamicContext setupDynamicContext(XSModel schema) {
61
		DynamicContext dc = new DefaultDynamicContext(schema, domDoc);
104
		DynamicContext dc = new DefaultDynamicContext(schema, domDoc);
62
		dc.add_namespace("xsd", "http://www.w3.org/2001/XMLSchema");
105
		dc.add_namespace("xs", "http://www.w3.org/2001/XMLSchema");
63
		dc.add_namespace("xdt", "http://www.w3.org/2004/10/xpath-datatypes");
106
		dc.add_namespace("fn", "http://www.w3.org/2005/xpath-functions");
64
107
65
		dc.add_function_library(new FnFunctionLibrary());
108
		dc.add_function_library(new FnFunctionLibrary());
66
		dc.add_function_library(new XSCtrLibrary());
109
		dc.add_function_library(new XSCtrLibrary());
67
		dc.add_function_library(new XDTCtrLibrary());
68
		return dc;
110
		return dc;
69
	}
111
	}
70
112
Lines 77-81 Link Here
77
		name_check.check(path);
119
		name_check.check(path);
78
		return path;
120
		return path;
79
	}
121
	}
122
	
123
	protected String getExpectedResult(String xqFile){
124
		String resultFile = xqFile;
125
		//
126
		if (resultFile.length()<10) {   //<9 enough? like XPST0001
127
			return resultFile;
128
		}
129
		String content="";
130
		//
131
		InputStream isrf;
132
		try {
133
			isrf = bundle.getEntry(resultFile).openStream();
134
			BufferedReader rfreader = new BufferedReader(new InputStreamReader(isrf));
135
			//XXX:assume char buffer 2048 is long enough;1024 maybe enough
136
	        //Exception: Axes085, NodeTest003/04/05,... 
137
			int bufferLength = 2048;
138
			if ((resultFile.indexOf("Axes085") != -1)
139
					|| (resultFile.indexOf("NodeTest003") != -1)
140
					|| (resultFile.indexOf("NodeTest004") != -1)
141
					|| (resultFile.indexOf("NodeTest005") != -1)) {
142
				bufferLength = 40000;
143
			}else if(resultFile.indexOf("ForExpr013") != -1) {
144
				bufferLength = 433500;
145
			}else if(resultFile.indexOf("ForExpr016") != -1
146
					|| (resultFile.indexOf("ReturnExpr011") != -1)
147
					|| (resultFile.indexOf("sgml-queries-results-q1") != -1)
148
					|| (resultFile.indexOf("sgml-queries-results-q2") != -1)) {
149
				bufferLength = 10240;
150
			}
151
			char[] cbuf = new char[bufferLength];
152
			int nByte = rfreader.read(cbuf);
153
	        assertTrue(resultFile,nByte<bufferLength);//assert nice buffer length
154
	        
155
	        content = new String(cbuf).trim();
156
	        rfreader.close();
157
	        isrf.close();
158
			
159
		} catch (IOException e) {
160
//			e.printStackTrace();
161
			content = "XPST0003";
162
		}
163
		return content;
164
	}
165
	
166
	public String extractXPathExpression(String xqFile, String inputFile) {
167
		// get the xpath2 expr from xq file, first
168
        char[] cbuf = new char[2048];//
169
        String content = null;
170
        String xpath2Expr = null;
171
		
172
		try {
173
			InputStream isxq =  bundle.getEntry(xqFile).openStream();
174
	        BufferedReader xqreader = new BufferedReader(new InputStreamReader(isxq));
175
	        int nByte = xqreader.read(cbuf);
176
	        assertTrue(xqFile,nByte<2048);
177
	        content = new String(cbuf).trim();
178
	        //
179
			if (content.indexOf(INPUT_CONTEXT) != -1
180
					&& content.indexOf(INPUT_CONTEXT1) == -1
181
					&& content.indexOf(INPUT_CONTEXT2) == -1) {
182
				inputMap.put(INPUT_CONTEXT, inputFile);
183
			} else if (content.indexOf(INPUT_CONTEXT1) == -1) {
184
				inputMap.put(INPUT_CONTEXT1, inputFile);
185
			} else if (content.indexOf(INPUT_CONTEXT2) != -1) {
186
				inputMap.put(INPUT_CONTEXT2, inputFile);
187
			}
188
	        //	        
189
	        if (content.indexOf(DECLARE_NAMESPACE)!=-1) {
190
	        	setupNamespace(content);
191
	        }
192
	        //
193
	        assertTrue(content.lastIndexOf(S_COMMENT2)!=-1);//assert to get
194
	        xpath2Expr = content.substring(content.lastIndexOf(S_COMMENT2)+2).trim(); 
195
	        
196
	        xqreader.close();
197
	        isxq.close();
198
		} catch (IOException e) {
199
			// TODO Auto-generated catch block
200
			e.printStackTrace();
201
		}
202
		return xpath2Expr;
203
	}
204
	
205
	protected void setupNamespace(String content) {
206
		Pattern p = Pattern.compile(REGEX_DN);
207
		Matcher m = p.matcher(content);
208
		while (m.find()) {
209
			assertTrue(m.groupCount()==2);//
210
			namespaceMap.put(m.group(1), m.group(2));
211
		}
212
		
213
	}
214
	
215
	protected DynamicContext setupVariables(DynamicContext dc) {
216
		dc.add_variable(new QName("x"));
217
		dc.add_variable(new QName("var"));
218
		ElementType elementType = new ElementType(domDoc.getDocumentElement(), 0);;
219
		dc.set_variable(new QName("input-context1"), elementType);
220
		
221
		return dc;
222
	}
223
224
	protected String buildResultString(ResultSequence rs) {
225
		String actual = new String();
226
		Iterator<AnyType> iterator = rs.iterator();
227
		while (iterator.hasNext()) {
228
			AnyType anyType = iterator.next();
229
			actual = actual + anyType.string_value() + " ";
230
		}
231
	
232
		return actual.trim();
233
	}
234
	
80
235
81
}
236
}
(-)src/org/eclipse/wst/xml/xpath2/processor/test/TestBugs.java (-2 / +311 lines)
Lines 7-19 Link Here
7
 * 
7
 * 
8
 * Contributors:
8
 * Contributors:
9
 *     David Carver (STAR) - initial API and implementation
9
 *     David Carver (STAR) - initial API and implementation
10
 *     Mukul Gandhi - bug 273719 - String-Length with Element Arg
10
 *     Mukul Gandhi - bug 273719 - improvements to fn:string-length function
11
 *     Mukul Gandhi - bug 273795 - improvements to substring function
11
 *     Mukul Gandhi - bug 273795 - improvements to fn:substring function
12
 *     Mukul Gandhi - bug 274471 - improvements to fn:string function
13
 *     Mukul Gandhi - bug 274719 - implementation of equality of xs:anyURI values
14
 *     Mukul Gandhi - bug 274725 - implementation of fn:base-uri function
15
 *     Mukul Gandhi - bug 274731 - implementation of fn:document-uri function
16
 *     Mukul Gandhi - bug 274784 - improvements to xs:boolean data type
17
 *     Mukul Gandhi - bug 274792 - improvements to xs:date data type
18
 *     Mukul Gandhi - bug 274805 - improvements to xs:integer data type
19
 *     Mukul Gandhi - bug 274952 - implementation of xs:long data type
20
 *     Mukul Gandhi - bug 275105 - implementation of xs:int data type
21
 *     Mukul Gandhi - bug 276134 - improvements to schema aware support for attribute nodes
12
 *******************************************************************************/
22
 *******************************************************************************/
13
package org.eclipse.wst.xml.xpath2.processor.test;
23
package org.eclipse.wst.xml.xpath2.processor.test;
14
24
15
import java.net.URL;
25
import java.net.URL;
16
26
27
import javax.xml.parsers.DocumentBuilder;
28
import javax.xml.parsers.DocumentBuilderFactory;
29
17
import org.apache.xerces.xs.XSModel;
30
import org.apache.xerces.xs.XSModel;
18
import org.eclipse.wst.xml.xpath2.processor.DefaultEvaluator;
31
import org.eclipse.wst.xml.xpath2.processor.DefaultEvaluator;
19
import org.eclipse.wst.xml.xpath2.processor.DynamicContext;
32
import org.eclipse.wst.xml.xpath2.processor.DynamicContext;
Lines 94-98 Link Here
94
107
95
		assertEquals("true", actual);
108
		assertEquals("true", actual);
96
	}
109
	}
110
	
111
	public void testStringFunctionBug274471() throws Exception {
112
		// Bug 274471
113
		URL fileURL = bundle.getEntry("/bugTestFiles/bug274471.xml");
114
		loadDOMDocument(fileURL);
115
		
116
		// Get XML Schema Information for the Document
117
		XSModel schema = getGrammar();
118
119
		DynamicContext dc = setupDynamicContext(schema);
120
121
		String xpath = "x/string() = 'unhappy'";
122
		XPath path = compileXPath(dc, xpath);
123
124
		Evaluator eval = new DefaultEvaluator(dc, domDoc);
125
		ResultSequence rs = eval.evaluate(path);
126
127
		XSBoolean result = (XSBoolean) rs.first();
128
129
		String actual = result.string_value();
130
131
		assertEquals("true", actual);
132
	}
133
	
134
	public void testStringLengthFunctionBug274471() throws Exception {
135
		// Bug 274471. string-length() with arity 0
136
		URL fileURL = bundle.getEntry("/bugTestFiles/bug274471.xml");
137
		loadDOMDocument(fileURL);
138
		
139
		// Get XML Schema Information for the Document
140
		XSModel schema = getGrammar();
141
142
		DynamicContext dc = setupDynamicContext(schema);
143
144
		String xpath = "x/string-length() = 7";
145
		XPath path = compileXPath(dc, xpath);
146
147
		Evaluator eval = new DefaultEvaluator(dc, domDoc);
148
		ResultSequence rs = eval.evaluate(path);
149
150
		XSBoolean result = (XSBoolean) rs.first();
151
152
		String actual = result.string_value();
153
154
		assertEquals("true", actual);
155
	}
156
	
157
	public void testNormalizeSpaceFunctionBug274471() throws Exception {
158
		// Bug 274471. normalize-space() with arity 0
159
		URL fileURL = bundle.getEntry("/bugTestFiles/bug274471.xml");
160
		loadDOMDocument(fileURL);
161
		
162
		// Get XML Schema Information for the Document
163
		XSModel schema = getGrammar();
164
165
		DynamicContext dc = setupDynamicContext(schema);
166
167
		String xpath = "x/normalize-space() = 'unhappy'";
168
		XPath path = compileXPath(dc, xpath);
169
170
		Evaluator eval = new DefaultEvaluator(dc, domDoc);
171
		ResultSequence rs = eval.evaluate(path);
172
173
		XSBoolean result = (XSBoolean) rs.first();
174
175
		String actual = result.string_value();
176
177
		assertEquals("true", actual);
178
	}
179
	
180
	public void testAnyUriEqualityBug() throws Exception {
181
		// Bug 274719
182
		// reusing the XML document from another bug
183
		URL fileURL = bundle.getEntry("/bugTestFiles/bug274471.xml");
184
		loadDOMDocument(fileURL);
185
		
186
		// Get XML Schema Information for the Document
187
		XSModel schema = getGrammar();
188
189
		DynamicContext dc = setupDynamicContext(schema);
190
		
191
		String xpath = "xs:anyURI('abc') eq xs:anyURI('abc')";
192
		XPath path = compileXPath(dc, xpath);
193
194
		Evaluator eval = new DefaultEvaluator(dc, domDoc);
195
		ResultSequence rs = eval.evaluate(path);
196
197
		XSBoolean result = (XSBoolean) rs.first();
198
199
		String actual = result.string_value();
200
201
		assertEquals("true", actual);
202
	}
203
	
204
	public void testBaseUriBug() throws Exception {
205
		// Bug 274725
206
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
207
		DocumentBuilder docBuilder = dbf.newDocumentBuilder();
208
		
209
		// for testing this bug, we read the XML document from the web. 
210
		// this ensures, that base-uri property of DOM is not null.
211
		domDoc = docBuilder.parse("http://www.w3schools.com/xml/note.xml");
212
213
		// we pass XSModel as null for this test case. Otherwise, we would
214
		// get an exception.
215
		DynamicContext dc = setupDynamicContext(null);
216
		
217
		String xpath = "base-uri(note) eq xs:anyURI('http://www.w3schools.com/xml/note.xml')";
218
		
219
		// please note: The below XPath would also work, with base-uri using arity 0.
220
		//String xpath = "note/base-uri() eq xs:anyURI('http://www.w3schools.com/xml/note.xml')";
221
		
222
		XPath path = compileXPath(dc, xpath);
223
224
		Evaluator eval = new DefaultEvaluator(dc, domDoc);
225
		ResultSequence rs = eval.evaluate(path);
226
227
		XSBoolean result = (XSBoolean) rs.first();
228
229
		String actual = result.string_value();
230
231
		assertEquals("true", actual);
232
	}
233
	
234
	public void testDocumentUriBug() throws Exception {
235
		// Bug 274731
236
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
237
		DocumentBuilder docBuilder = dbf.newDocumentBuilder();
238
		
239
		domDoc = docBuilder.parse("http://www.w3schools.com/xml/note.xml");
240
241
		DynamicContext dc = setupDynamicContext(null);
242
		
243
		String xpath = "document-uri(/) eq xs:anyURI('http://www.w3schools.com/xml/note.xml')";
244
		
245
		XPath path = compileXPath(dc, xpath);
246
247
		Evaluator eval = new DefaultEvaluator(dc, domDoc);
248
		ResultSequence rs = eval.evaluate(path);
249
250
		XSBoolean result = (XSBoolean) rs.first();
251
252
		String actual = "false";
253
		
254
		if (result != null) {
255
		  actual = result.string_value();
256
		}
257
258
		assertEquals("true", actual);
259
	}
260
	
261
	public void testBooleanTypeBug() throws Exception {
262
		// Bug 274784
263
		// reusing the XML document from another bug
264
		URL fileURL = bundle.getEntry("/bugTestFiles/bug273719.xml");
265
		loadDOMDocument(fileURL);
266
		
267
		// Get XML Schema Information for the Document
268
		XSModel schema = getGrammar();
269
270
		DynamicContext dc = setupDynamicContext(schema);
271
		
272
		String xpath = "xs:boolean('1') eq xs:boolean('true')";
273
		XPath path = compileXPath(dc, xpath);
274
275
		Evaluator eval = new DefaultEvaluator(dc, domDoc);
276
		ResultSequence rs = eval.evaluate(path);
277
278
		XSBoolean result = (XSBoolean) rs.first();
279
280
		String actual = result.string_value();
281
282
		assertEquals("true", actual);
283
	}
284
	
285
	public void testDateConstructorBug() throws Exception {
286
		// Bug 274792
287
		URL fileURL = bundle.getEntry("/bugTestFiles/bug274792.xml");
288
		loadDOMDocument(fileURL);
289
		
290
		// Get XML Schema Information for the Document
291
		XSModel schema = getGrammar();
292
293
		DynamicContext dc = setupDynamicContext(schema);
294
		
295
		String xpath = "xs:date('2009-01-01') eq xs:date('2009-01-01')";
296
		XPath path = compileXPath(dc, xpath);
297
298
		Evaluator eval = new DefaultEvaluator(dc, domDoc);
299
		ResultSequence rs = eval.evaluate(path);
300
301
		XSBoolean result = (XSBoolean) rs.first();
302
303
		String actual = result.string_value();
304
305
		assertEquals("true", actual);
306
	}
307
	
308
	public void testIntegerDataTypeBug() throws Exception {
309
		// Bug 274805
310
		URL fileURL = bundle.getEntry("/bugTestFiles/bug274805.xml");
311
		loadDOMDocument(fileURL);
312
		
313
		// Get XML Schema Information for the Document
314
		XSModel schema = getGrammar();
315
316
		DynamicContext dc = setupDynamicContext(schema);
317
		
318
		// xs:integer by definition is from -INF to +INF
319
		String xpath = "xs:integer(x) gt 100";
320
		XPath path = compileXPath(dc, xpath);
321
322
		Evaluator eval = new DefaultEvaluator(dc, domDoc);
323
		ResultSequence rs = eval.evaluate(path);
324
325
		XSBoolean result = (XSBoolean) rs.first();
326
327
		String actual = result.string_value();
328
329
		assertEquals("true", actual);
330
	}
331
	
332
	public void testLongDataType() throws Exception {
333
		// Bug 274952
334
		URL fileURL = bundle.getEntry("/TestSources/emptydoc.xml");
335
		loadDOMDocument(fileURL);
336
		
337
		// Get XML Schema Information for the Document
338
		XSModel schema = getGrammar();
339
340
		DynamicContext dc = setupDynamicContext(schema);
341
		
342
		// long min value is -9223372036854775808
343
		// and max value can be 9223372036854775807
344
		String xpath = "xs:long('9223372036854775807') gt 0";
345
		XPath path = compileXPath(dc, xpath);
346
347
		Evaluator eval = new DefaultEvaluator(dc, domDoc);
348
		ResultSequence rs = eval.evaluate(path);
349
350
		XSBoolean result = (XSBoolean) rs.first();
351
352
		String actual = result.string_value();
353
354
		assertEquals("true", actual);
355
	}
356
	
357
	public void testIntDataType() throws Exception {
358
		// Bug 275105
359
		URL fileURL = bundle.getEntry("/TestSources/emptydoc.xml");
360
		loadDOMDocument(fileURL);
361
		
362
		// Get XML Schema Information for the Document
363
		XSModel schema = getGrammar();
364
365
		DynamicContext dc = setupDynamicContext(schema);
366
		
367
		// int min value is -2147483648
368
		// and max value can be 2147483647
369
		String xpath = "xs:int('2147483647') gt 0";
370
		XPath path = compileXPath(dc, xpath);
371
372
		Evaluator eval = new DefaultEvaluator(dc, domDoc);
373
		ResultSequence rs = eval.evaluate(path);
374
375
		XSBoolean result = (XSBoolean) rs.first();
376
377
		String actual = result.string_value();
378
379
		assertEquals("true", actual);
380
	}
381
	
382
	public void testSchemaawareness() throws Exception {
383
		// Bug 276134
384
		URL fileURL = bundle.getEntry("/bugTestFiles/bug276134.xml");
385
		URL schemaURL = bundle.getEntry("/bugTestFiles/bug276134.xsd");
386
387
		loadDOMDocument(fileURL, schemaURL);
388
		
389
		// Get XSModel object for the Schema
390
		XSModel schema = getGrammar();
391
392
		DynamicContext dc = setupDynamicContext(schema);
393
		
394
		String xpath = "person/@dob eq xs:date('2006-12-10')";
395
		XPath path = compileXPath(dc, xpath);
396
397
		Evaluator eval = new DefaultEvaluator(dc, domDoc);
398
		ResultSequence rs = eval.evaluate(path);
399
400
		XSBoolean result = (XSBoolean) rs.first();
401
402
		String actual = result.string_value();
403
404
		assertEquals("true", actual);
405
	}
97
406
98
}
407
}
(-)bugTestFiles/bug276134.xsd (+14 lines)
Added Link Here
1
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
2
 
3
  <xs:element name="person">
4
   <xs:complexType>
5
    <xs:sequence>
6
     <xs:element name="fname" type = "xs:string" />
7
     <xs:element name="lname" type = "xs:string" />
8
    </xs:sequence>
9
    <xs:attribute name="id" type="xs:decimal" />
10
    <xs:attribute name="dob" type="xs:date" />
11
   </xs:complexType>
12
  </xs:element>
13
 
14
</xs:schema>
(-)bugTestFiles/bug276134.xml (+4 lines)
Added Link Here
1
<person id="100" dob="2006-12-10" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
2
  <fname>Mukul</fname>
3
  <lname>Gandhi</lname>
4
</person>

Return to bug 276134