2 // System.Xml.Xsl.XslTransformTests.cs
5 // Atsushi Enomoto <ginga@kit.hi-ho.ne.jp>
7 // (C) 2002 Atsushi Enomoto
11 using System.Globalization;
15 using System.Xml.XPath;
17 using NUnit.Framework;
19 namespace MonoTests.System.Xml.Xsl
22 public class XslTransformTests
29 public void GetReady()
31 doc = new XmlDocument ();
32 xslt = new XslTransform ();
33 result = new XmlDocument ();
37 public void TestBasicTransform ()
39 doc.LoadXml ("<root/>");
40 xslt.Load ("Test/XmlFiles/xsl/empty.xsl");
41 xslt.Transform ("Test/XmlFiles/xsl/empty.xsl", "Test/XmlFiles/xsl/result.xml");
42 result.Load ("Test/XmlFiles/xsl/result.xml");
43 Assert.AreEqual (2, result.ChildNodes.Count, "count");
47 [ExpectedException (typeof (XsltCompileException))]
48 public void InvalidStylesheet ()
50 XmlDocument doc = new XmlDocument ();
51 doc.LoadXml ("<xsl:element xmlns:xsl='http://www.w3.org/1999/XSL/Transform' />");
52 XslTransform t = new XslTransform ();
57 [ExpectedException (typeof (XsltCompileException))]
58 public void EmptyStylesheet ()
60 XmlDocument doc = new XmlDocument ();
61 XslTransform t = new XslTransform ();
66 [ExpectedException (typeof (XsltCompileException))]
67 public void InvalidStylesheet2 ()
69 string xsl = @"<xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'>
70 <xsl:template match='/root'>
71 <xsl:call-template name='foo'>
72 <xsl:with-param name='name' value='text()' />
75 <xsl:template name='foo'>
76 <xsl:param name='name' />
79 <xsl:variable name='last' value='text()' />
80 <xsl:value-of select='$last' />
86 XslTransform xslt = new XslTransform ();
87 xslt.Load (new XPathDocument (new XmlTextReader (xsl, XmlNodeType.Document, null)));
91 [Category ("NotWorking")] // it depends on "mcs" existence
92 public void MsxslTest() {
93 string _styleSheet = @"
94 <xslt:stylesheet xmlns:xslt=""http://www.w3.org/1999/XSL/Transform"" version=""1.0""
95 xmlns:msxsl=""urn:schemas-microsoft-com:xslt"" xmlns:stringutils=""urn:schemas-sourceforge.net-blah"">
96 <xslt:output method=""text"" />
97 <msxsl:script language=""C#"" implements-prefix=""stringutils"">
99 string PadRight( string str, int padding) {
100 return str.PadRight(padding);
104 <xslt:template match=""test"">
105 <xslt:value-of select=""stringutils:PadRight(@name, 20)"" />
109 StringReader stringReader = new StringReader(_styleSheet);
111 XslTransform transform = new XslTransform();
112 XmlTextReader reader = new XmlTextReader(stringReader);
113 transform.Load(reader, new XmlUrlResolver(), AppDomain.CurrentDomain.Evidence);
115 StringBuilder sb = new StringBuilder();
116 StringWriter writer = new StringWriter(sb, CultureInfo.InvariantCulture);
117 XsltArgumentList arguments = new XsltArgumentList();
119 XmlDocument xmlDoc = new XmlDocument();
120 xmlDoc.LoadXml("<test name=\"test\" />");
123 transform.Transform(xmlDoc, new XsltArgumentList(), writer, new XmlUrlResolver());
125 Assert.AreEqual ("test".PadRight(20), sb.ToString());
129 public void MSXslNodeSet ()
131 string xsl = @"<xsl:stylesheet version='1.0'
132 xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns:msxsl='urn:schemas-microsoft-com:xslt'>
133 <xsl:template match='/'>
135 <xsl:variable name='var'>
136 <xsl:copy-of select='root/foo' />
138 <xsl:for-each select='msxsl:node-set($var)/foo'>
139 <xsl:value-of select='name(.)' />: <xsl:value-of select='@attr' />
144 StringWriter sw = new StringWriter ();
145 XslTransform t = new XslTransform ();
146 t.Load (new XPathDocument (new StringReader (xsl)));
147 t.Transform (new XPathDocument (new XmlTextReader (new StringReader ("<root><foo attr='A'/><foo attr='B'/><foo attr='C'/></root>"))), null, sw);
148 Assert.AreEqual (@"<?xml version=""1.0"" encoding=""utf-16""?><root xmlns:msxsl=""urn:schemas-microsoft-com:xslt"">foo: Afoo: Bfoo: C</root>", sw.ToString ());
152 [Category ("NotDotNet")]
153 // Actually MS.NET here throws XsltException, but Mono returns
154 // XPathException (since XPath evaluation engine generally
155 // catches (should catch) static error. It is implementation
157 [ExpectedException (typeof (XPathException))]
158 public void MSXslNodeSetRejectsNodeSet ()
160 string xsl = @"<xsl:stylesheet version='1.0'
161 xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns:msxsl='urn:schemas-microsoft-com:xslt'>
162 <xsl:template match='/'>
164 <!-- msxsl:node-set() does not accept a node set -->
165 <xsl:for-each select='msxsl:node-set(root/foo)'>
166 <xsl:value-of select='name(.)' />: <xsl:value-of select='@attr' />
171 StringWriter sw = new StringWriter ();
172 XslTransform t = new XslTransform ();
173 t.Load (new XPathDocument (new StringReader (xsl)));
174 t.Transform (new XPathDocument (new XmlTextReader (new StringReader ("<root><foo attr='A'/><foo attr='B'/><foo attr='C'/></root>"))), null, sw);
178 public void EvaluateEmptyVariableAsBoolean ()
180 string xsl = @"<xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'>
181 <xsl:template match='/'>
182 <xsl:variable name='var'><empty /></xsl:variable>
183 <root><xsl:if test='$var'>true</xsl:if></root>
186 XslTransform t = new XslTransform ();
187 t.Load (new XPathDocument (new StringReader (xsl)));
188 StringWriter sw = new StringWriter ();
190 new XPathDocument (new StringReader ("<root/>")),
193 Assert.IsTrue (sw.ToString ().IndexOf ("true") > 0);
197 [ExpectedException (typeof (XsltCompileException))]
198 public void NotAllowedPatternAxis ()
200 string xsl = @"<xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'>
201 <xsl:template match='/descendant-or-self::node()/elem'>
205 new XslTransform ().Load (new XPathDocument (
206 new StringReader (xsl)));
210 [ExpectedException (typeof (XsltCompileException))]
211 public void ImportIncorrectlyLocated ()
213 string xsl = @"<xsl:transform xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'>
214 <xsl:template match='/'></xsl:template>
215 <xsl:import href='dummy.xsl' />
217 new XslTransform ().Load (new XPathDocument (
218 new StringReader (xsl)));
221 private WeakReference StylesheetLoad (XslTransform t, string xsl)
223 XPathDocument doc = new XPathDocument (
224 new StringReader (xsl));
225 WeakReference wr = new WeakReference (doc);
230 private WeakReference StylesheetTransform (XslTransform t, string xml)
232 XPathDocument doc = new XPathDocument (
233 new StringReader (xml));
234 WeakReference wr = new WeakReference (doc);
235 t.Transform (doc, null, TextWriter.Null, null);
241 public void ErrorOnDocumentResolution ()
243 // XslTransform recovers from errors on document resolution.
244 string xslText = @"<xsl:stylesheet
245 xmlns:xsl='http://www.w3.org/1999/XSL/Transform'
247 <xsl:variable name='n'
248 select='document(""notexist.xml"")' />
249 <xsl:template match='/'>xx</xsl:template>
251 string xmlText = @"<root />";
252 XslTransform transform = new XslTransform ();
253 XPathDocument doc = new XPathDocument (
254 new XmlTextReader ("a.xsl", new StringReader (xslText)));
255 transform.Load (doc);
256 XPathDocument xmlDocument = new XPathDocument (new StringReader (xmlText));
258 StringWriter sw = new StringWriter ();
259 transform.Transform (xmlDocument, null, sw);
262 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
263 "xx", sw.ToString ());
268 public void LoadStyleFromNonRoot ()
270 XmlDocument doc = new XmlDocument ();
271 XslTransform xslt = new XslTransform ();
272 doc.LoadXml ("<root><dummy /><xsl:transform xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0' /></root>");
273 XmlNode node = doc.ChildNodes [0].ChildNodes [1];
274 xslt.Load (node, null, null);
278 public void ReturnEmptyResultsAsXmlReader ()
281 XmlDocument doc = new XmlDocument ();
282 doc.LoadXml ("<xsl:transform xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0' />");
283 XslTransform xslt = new XslTransform ();
284 xslt.Load (doc, null, null);
285 XmlReader reader = xslt.Transform(doc, null, new XmlUrlResolver ());
288 // another case - with xsl:output standalone='yes'
289 doc.LoadXml ("<xsl:transform xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0' ><xsl:output standalone='yes' indent='no'/><xsl:template match='/'><foo/></xsl:template></xsl:transform>");
290 xslt = new XslTransform ();
291 xslt.Load (doc, null, null);
292 reader = xslt.Transform (doc, null, new XmlUrlResolver ());
294 reader.Read (); // btw no XMLdecl output.
298 // http://www.w3.org/TR/xslt#section-Creating-Elements-with-xsl:element
299 // "If the namespace attribute is not present then the QName
300 // is expanded into an expanded-name using the namespace
301 // declarations in effect for the xsl:element element,
302 // including any default namespace declaration."
303 public void LREDefaultNamespace ()
305 string xsl = @"<xsl:stylesheet version='1.0' xmlns='urn:foo' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
306 <xsl:template match='/*'>
307 <xsl:element name='{local-name()}' />
310 string xml = "<root/>";
311 XslTransform t = new XslTransform ();
312 t.Load (new XPathDocument (new StringReader (xsl)));
313 StringWriter sw = new StringWriter ();
314 XmlTextWriter xw = new XmlTextWriter (sw);
316 new XPathDocument (new StringReader (xml)),
318 Assert.AreEqual ("<root xmlns=\"urn:foo\" />",
321 string xsl2 = @"<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns='urn:foo'>
322 <xsl:template match='/*'>
324 <xsl:element name='{local-name()}' />
328 string xml2 = "<page/>";
329 t.Load (new XPathDocument (new StringReader (xsl2)));
330 sw = new StringWriter ();
331 xw = new XmlTextWriter (sw);
333 new XPathDocument (new StringReader (xml2)),
335 Assert.AreEqual ("<root xmlns=\"urn:foo\"><page /></root>",
340 // http://lists.ximian.com/pipermail/mono-devel-list/2005-November/015812.html
341 public void WhitespaceHandling ()
343 string ref_out = @"XML
344 Extensible Markup language
347 Extensible Markup language
350 Extensible Markup language
353 Extensible Markup language
357 XmlDocument d = new XmlDocument ();
358 d.Load ("Test/XmlFiles/xsl/91834.xml");
360 XslTransform t = new XslTransform ();
361 t.Load ("Test/XmlFiles/xsl/91834.xsl");
363 StringWriter sw_raw = new StringWriter ();
364 t.Transform (d, null, sw_raw);
366 Assert.AreEqual (ref_out, sw_raw.ToString ().Replace ("\r\n", "\n"));
369 // http://support.microsoft.com/default.aspx?scid=kb;en-us;829014
371 public void EmptyNodeSetSort ()
373 string xmlFragment = @"<?xml version=""1.0"" encoding=""utf-8""?>
384 <SKILL>VB.NET</SKILL>
385 <SKILL>SQl Server</SKILL>
389 string xsltFragment = @"<?xml version=""1.0""?>
390 <xsl:stylesheet version=""1.0"" xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"">
391 <xsl:output omit-xml-declaration=""yes"" />
392 <xsl:preserve-space elements=""*"" />
393 <xsl:template match=""/EMPLOYEES"">
394 <xsl:for-each select=""EMPLOYEE[DEPT='Finance']"">
395 <xsl:sort select=""NAME""/>
396 <xsl:value-of select=""NAME""/>
401 XmlTextReader xmlRdr = new XmlTextReader (new StringReader (xmlFragment));
402 XmlTextReader xsltRdr = new XmlTextReader (new StringReader (xsltFragment));
404 XslTransform stylesheet = new XslTransform ();
405 stylesheet.Load (xsltRdr, new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
407 StringWriter sw = new StringWriter ();
409 stylesheet.Transform (new XPathDocument (xmlRdr), new XsltArgumentList (),
410 sw, new XmlUrlResolver ());
412 Assert.AreEqual (0, sw.ToString ().Length);
415 // http://support.microsoft.com/default.aspx?scid=kb;en-us;834667
417 [Category ("NotDotNet")]
418 public void LocalParameter ()
420 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
421 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
422 <xsl:param name=""param1"" select=""'global-param1-default'"" />
423 <xsl:param name=""param2"" select=""'global-param2-default'"" />
424 <xsl:output method=""text"" encoding=""ascii"" />
425 <xsl:template match=""/"">
426 <xsl:call-template name=""Test"">
427 <xsl:with-param name=""param1"" select=""'local-param1-arg'"" />
428 <xsl:with-param name=""param2"" select=""'local-param2-arg'"" />
431 <xsl:template name=""Test"">
432 <xsl:param name=""param1"" select=""'local-param1-default'"" />
433 <xsl:param name=""param2"" select=""'local-param2-default'"" />
434 <xsl:value-of select=""$param1"" /><xsl:text>/</xsl:text><xsl:value-of select=""$param2"" />
438 XmlDocument xmlDoc = new XmlDocument ();
439 xmlDoc.LoadXml ("<dummy />");
441 XslTransform xsltProcessor = new XslTransform ();
442 xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
443 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
445 StringWriter sw = new StringWriter ();
447 XsltArgumentList xsltArgs = new XsltArgumentList ();
448 xsltArgs.AddParam ("param1", string.Empty, "global-param1-arg");
449 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
451 Assert.AreEqual ("local-param1-arg/local-param2-arg", sw.ToString ());
455 public void Output_Standalone ()
457 StringWriter sw = null;
458 XsltArgumentList xsltArgs = new XsltArgumentList ();
459 XslTransform xsltProcessor = new XslTransform ();
461 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
462 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
464 <xsl:template match=""/"">
469 XmlDocument xmlDoc = new XmlDocument ();
470 xmlDoc.LoadXml ("<dummy />");
472 sw = new StringWriter ();
473 xsltProcessor.Load (new XmlTextReader (new StringReader (
474 string.Format(xsltFragment, "standalone=\"yes\""))),
475 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
476 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
479 "<?xml version=\"1.0\" encoding=\"utf-16\"" +
480 " standalone=\"yes\"?><root />", sw.ToString (), "#1");
482 sw = new StringWriter ();
483 xsltProcessor.Load (new XmlTextReader (new StringReader (
484 string.Format (xsltFragment, "standalone=\"no\""))),
485 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
486 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
489 "<?xml version=\"1.0\" encoding=\"utf-16\"" +
490 " standalone=\"no\"?><root />", sw.ToString (), "#2");
492 sw = new StringWriter ();
493 xsltProcessor.Load (new XmlTextReader (new StringReader (
494 string.Format (xsltFragment, ""))),
495 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
496 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
499 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
500 "<root />", sw.ToString (), "#3");
504 [ExpectedException (typeof (XsltCompileException))]
505 public void Output_Standalone_Invalid ()
507 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
508 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
509 <xsl:output standalone=""Yes"" />
511 XslTransform xsltProcessor = new XslTransform ();
512 xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
513 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
517 public void Output_Standalone_ForwardsCompatible ()
519 StringWriter sw = new StringWriter ();
520 XsltArgumentList xsltArgs = new XsltArgumentList ();
521 XslTransform xsltProcessor = new XslTransform ();
522 XmlDocument xmlDoc = new XmlDocument ();
523 xmlDoc.LoadXml ("<dummy />");
525 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
526 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.5"">
527 <xsl:output standalone=""{0}"" />
528 <xsl:template match=""/"">
533 // standalone is "Yes"
534 xsltProcessor.Load (new XmlTextReader (new StringReader (
535 string.Format (xsltFragment, "Yes"))),
536 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
537 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
540 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
541 "<root />", sw.ToString (), "#1");
543 // standalone is empty
544 sw.GetStringBuilder ().Length = 0;
545 xsltProcessor.Load (new XmlTextReader (new StringReader (
546 string.Format (xsltFragment, ""))),
547 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
548 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
551 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
552 "<root />", sw.ToString (), "#2");
556 [ExpectedException (typeof (XsltCompileException))]
557 public void Output_Standalone_Empty ()
559 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
560 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
561 <xsl:output standalone="""" />
563 XslTransform xsltProcessor = new XslTransform ();
564 xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
565 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
569 public void Output_OmitXmlDeclaration ()
571 StringWriter sw = null;
572 XsltArgumentList xsltArgs = new XsltArgumentList ();
573 XslTransform xsltProcessor = new XslTransform ();
575 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
576 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
578 <xsl:template match=""/"">
583 XmlDocument xmlDoc = new XmlDocument ();
584 xmlDoc.LoadXml ("<dummy />");
586 sw = new StringWriter ();
587 xsltProcessor.Load (new XmlTextReader (new StringReader (
588 string.Format (xsltFragment, "omit-xml-declaration=\"yes\""))),
589 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
590 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
592 Assert.AreEqual ("<root />", sw.ToString (), "#1");
594 sw.GetStringBuilder ().Length = 0;
595 xsltProcessor.Load (new XmlTextReader (new StringReader (
596 string.Format (xsltFragment, "omit-xml-declaration=\"no\""))),
597 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
598 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
601 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
602 "<root />", sw.ToString (), "#2");
606 [ExpectedException (typeof (XsltCompileException))]
607 public void Output_OmitXmlDeclaration_Invalid ()
609 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
610 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
611 <xsl:output omit-xml-declaration=""Yes"" />
613 XslTransform xsltProcessor = new XslTransform ();
614 xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
615 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
619 [ExpectedException (typeof (XsltCompileException))]
620 public void Output_OmitXmlDeclaration_Empty ()
622 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
623 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
624 <xsl:output omit-xml-declaration="""" />
626 XslTransform xsltProcessor = new XslTransform ();
627 xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
628 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
632 public void Output_OmitXmlDeclaration_ForwardsCompatible ()
634 StringWriter sw = new StringWriter ();
635 XsltArgumentList xsltArgs = new XsltArgumentList ();
636 XslTransform xsltProcessor = new XslTransform ();
637 XmlDocument xmlDoc = new XmlDocument ();
638 xmlDoc.LoadXml ("<dummy />");
640 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
641 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.5"">
642 <xsl:output omit-xml-declaration=""{0}"" />
643 <xsl:template match=""/"">
648 // omit-xml-declaration is "Yes"
649 xsltProcessor.Load (new XmlTextReader (new StringReader (
650 string.Format (xsltFragment, "Yes"))),
651 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
652 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
655 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
656 "<root />", sw.ToString (), "#1");
658 // omit-xml-declaration is empty
659 sw.GetStringBuilder ().Length = 0;
660 xsltProcessor.Load (new XmlTextReader (new StringReader (
661 string.Format (xsltFragment, ""))),
662 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
663 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
666 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
667 "<root />", sw.ToString (), "#2");
671 public void Output_DocType_Xml ()
673 XsltArgumentList xsltArgs = new XsltArgumentList ();
674 XslTransform xsltProcessor = new XslTransform ();
676 // set both doctype-system and doctype-public
677 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
678 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
680 doctype-public=""-//W3C//DTD XHTML 1.0 Strict//EN""
681 doctype-system=""http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"" />
682 <xsl:template match=""/"">
683 <xsl:element name=""test"">
684 <xsl:element name=""abc"" />
689 XmlDocument xmlDoc = new XmlDocument ();
690 xmlDoc.LoadXml ("<dummy />");
692 StringWriter sw = new StringWriter ();
693 xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
694 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
695 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
698 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
699 "<!DOCTYPE test PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">" +
700 "<test><abc /></test>", sw.ToString (), "#1");
702 // only set doctype-public
703 xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
704 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
706 doctype-public=""-//W3C//DTD XHTML 1.0 Strict//EN"" />
707 <xsl:template match=""/"">
708 <xsl:element name=""test"">
709 <xsl:element name=""abc"" />
714 sw.GetStringBuilder ().Length = 0;
715 xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
716 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
717 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
720 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
721 "<test><abc /></test>", sw.ToString (), "#2");
723 // only set doctype-system
724 xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
725 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
728 doctype-system=""http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"" />
729 <xsl:template match=""/"">
730 <xsl:element name=""test"">
731 <xsl:element name=""abc"" />
736 sw.GetStringBuilder ().Length = 0;
737 xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
738 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
739 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
742 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
743 "<!DOCTYPE test SYSTEM \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">" +
744 "<test><abc /></test>", sw.ToString (), "#3");
746 // set empty doctype-public and empty doctype-system
747 xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
748 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
751 doctype-system="""" />
752 <xsl:template match=""/"">
753 <xsl:element name=""test"">
754 <xsl:element name=""abc"" />
759 sw.GetStringBuilder ().Length = 0;
760 xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
761 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
762 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
765 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
766 "<!DOCTYPE test PUBLIC \"\" \"\">" +
767 "<test><abc /></test>", sw.ToString (), "#4");
769 // set empty doctype-public
770 xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
771 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
774 doctype-public="""" />
775 <xsl:template match=""/"">
776 <xsl:element name=""test"">
777 <xsl:element name=""abc"" />
782 sw.GetStringBuilder ().Length = 0;
783 xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
784 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
785 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
788 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
789 "<test><abc /></test>", sw.ToString (), "#5");
791 // set empty doctype-system
792 xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
793 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
795 doctype-system="""" />
796 <xsl:template match=""/"">
797 <xsl:element name=""test"">
798 <xsl:element name=""abc"" />
803 sw.GetStringBuilder ().Length = 0;
804 xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
805 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
806 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
809 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
810 "<!DOCTYPE test SYSTEM \"\">" +
811 "<test><abc /></test>", sw.ToString (), "#6");
815 public void Output_DocType_Html ()
817 XsltArgumentList xsltArgs = new XsltArgumentList ();
818 XslTransform xsltProcessor = new XslTransform ();
820 // set both doctype-system and doctype-public
821 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
822 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
826 doctype-public=""-//W3C//DTD XHTML 1.0 Strict//EN""
827 doctype-system=""http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"" />
828 <xsl:template match=""/"">
829 <xsl:element name=""test"">
830 <xsl:element name=""abc"" />
835 XmlDocument xmlDoc = new XmlDocument ();
836 xmlDoc.LoadXml ("<dummy />");
838 StringWriter sw = new StringWriter ();
839 xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
840 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
841 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
844 "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">" +
845 "<test><abc></abc></test>", sw.ToString (), "#1");
847 // only set doctype-public
848 xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
849 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
853 doctype-public=""-//W3C//DTD XHTML 1.0 Strict//EN"" />
854 <xsl:template match=""/"">
855 <xsl:element name=""test"">
856 <xsl:element name=""abc"" />
861 sw.GetStringBuilder ().Length = 0;
862 xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
863 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
864 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
867 "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" >" +
868 "<test><abc></abc></test>", sw.ToString (), "#2");
870 // only set doctype-system
871 xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
872 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
876 doctype-system=""http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"" />
877 <xsl:template match=""/"">
878 <xsl:element name=""test"">
879 <xsl:element name=""abc"" />
884 sw.GetStringBuilder ().Length = 0;
885 xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
886 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
887 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
890 "<!DOCTYPE html SYSTEM \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">" +
891 "<test><abc></abc></test>", sw.ToString (), "#3");
893 // set empty doctype-public and empty doctype-system
894 xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
895 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
899 doctype-public="""" doctype-system="""" />
900 <xsl:template match=""/"">
901 <xsl:element name=""test"">
902 <xsl:element name=""abc"" />
907 sw.GetStringBuilder ().Length = 0;
908 xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
909 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
910 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
913 "<!DOCTYPE html PUBLIC \"\" \"\">" +
914 "<test><abc></abc></test>", sw.ToString (), "#4");
916 // set empty doctype-public
917 xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
918 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
922 doctype-public="""" />
923 <xsl:template match=""/"">
924 <xsl:element name=""test"">
925 <xsl:element name=""abc"" />
930 sw.GetStringBuilder ().Length = 0;
931 xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
932 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
933 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
936 "<!DOCTYPE html PUBLIC \"\" >" +
937 "<test><abc></abc></test>", sw.ToString (), "#5");
939 // set empty doctype-system
940 xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
941 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
945 doctype-system="""" />
946 <xsl:template match=""/"">
947 <xsl:element name=""test"">
948 <xsl:element name=""abc"" />
953 sw.GetStringBuilder ().Length = 0;
954 xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
955 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
956 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
959 "<!DOCTYPE html SYSTEM \"\">" +
960 "<test><abc></abc></test>", sw.ToString (), "#6");
964 public void Output_Indent_Xml_DocType ()
966 XsltArgumentList xsltArgs = new XsltArgumentList ();
967 XslTransform xsltProcessor = new XslTransform ();
969 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
970 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
972 doctype-public=""-//W3C//DTD XHTML 1.0 Strict//EN""
973 doctype-system=""http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd""
975 <xsl:template match=""/"">
976 <xsl:element name=""test"">
977 <xsl:element name=""something"">
978 <xsl:element name=""else"" />
984 XmlDocument xmlDoc = new XmlDocument ();
985 xmlDoc.LoadXml ("<dummy />");
988 StringWriter sw = new StringWriter ();
989 xsltProcessor.Load (new XmlTextReader (new StringReader (
990 string.Format (xsltFragment, "indent=\"yes\""))),
991 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
992 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
994 Assert.AreEqual (string.Format(CultureInfo.InvariantCulture,
995 "<?xml version=\"1.0\" encoding=\"utf-16\"?>{0}" +
996 "<!DOCTYPE test PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">{0}" +
1000 " </something>{0}" +
1001 "</test>", Environment.NewLine), sw.ToString (), "#1");
1004 sw.GetStringBuilder ().Length = 0;
1005 xsltProcessor.Load (new XmlTextReader (new StringReader (
1006 string.Format (xsltFragment, "indent=\"no\""))),
1007 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1008 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
1011 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
1012 "<!DOCTYPE test PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">" +
1013 "<test><something><else /></something></test>", sw.ToString (),
1017 sw.GetStringBuilder ().Length = 0;
1018 xsltProcessor.Load (new XmlTextReader (new StringReader (
1019 string.Format (xsltFragment, ""))),
1020 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1021 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
1024 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
1025 "<!DOCTYPE test PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">" +
1026 "<test><something><else /></something></test>", sw.ToString (),
1031 [Category ("NotWorking")] // bug #77081: mono does not output newline and indentation for non-html elements
1032 public void Output_Indent_Html_DocType ()
1034 XsltArgumentList xsltArgs = new XsltArgumentList ();
1035 XslTransform xsltProcessor = new XslTransform ();
1037 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
1038 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
1041 doctype-public=""-//W3C//DTD XHTML 1.0 Strict//EN""
1042 doctype-system=""http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd""
1044 <xsl:template match=""/"">
1045 <xsl:element name=""test"">
1046 <xsl:element name=""something"">
1047 <xsl:element name=""else"" />
1053 XmlDocument xmlDoc = new XmlDocument ();
1054 xmlDoc.LoadXml ("<dummy />");
1056 // set indent to yes
1057 StringWriter sw = new StringWriter ();
1058 xsltProcessor.Load (new XmlTextReader (new StringReader (
1059 string.Format (xsltFragment, "indent=\"yes\""))),
1060 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1061 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
1063 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
1064 "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">{0}" +
1069 " </something>{0}" +
1070 "</test>", Environment.NewLine), sw.ToString (), "#1");
1073 sw.GetStringBuilder ().Length = 0;
1074 xsltProcessor.Load (new XmlTextReader (new StringReader (
1075 string.Format (xsltFragment, "indent=\"no\""))),
1076 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1077 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
1079 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
1080 "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">" +
1081 "<test><something><else></else></something></test>",
1082 Environment.NewLine), sw.ToString (), "#2");
1085 sw.GetStringBuilder ().Length = 0;
1086 xsltProcessor.Load (new XmlTextReader (new StringReader (
1087 string.Format (xsltFragment, ""))),
1088 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1089 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
1091 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
1092 "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">{0}" +
1097 " </something>{0}" +
1098 "</test>", Environment.NewLine), sw.ToString (), "#3");
1102 public void Output_Indent_Xml ()
1104 XsltArgumentList xsltArgs = new XsltArgumentList ();
1105 XslTransform xsltProcessor = new XslTransform ();
1107 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
1108 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
1111 <xsl:template match=""/"">
1112 <xsl:element name=""test"">
1113 <xsl:element name=""something"">
1114 <xsl:element name=""else"" />
1120 XmlDocument xmlDoc = new XmlDocument ();
1121 xmlDoc.LoadXml ("<dummy />");
1123 // set indent to yes
1124 StringWriter sw = new StringWriter ();
1125 xsltProcessor.Load (new XmlTextReader (new StringReader (
1126 string.Format (xsltFragment, "indent=\"yes\""))),
1127 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1128 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
1130 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
1131 "<?xml version=\"1.0\" encoding=\"utf-16\"?>{0}" +
1135 " </something>{0}" +
1136 "</test>", Environment.NewLine), sw.ToString (), "#1");
1139 sw.GetStringBuilder ().Length = 0;
1140 xsltProcessor.Load (new XmlTextReader (new StringReader (
1141 string.Format (xsltFragment, "indent=\"no\""))),
1142 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1143 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
1146 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
1147 "<test><something><else /></something></test>", sw.ToString (),
1151 sw.GetStringBuilder ().Length = 0;
1152 xsltProcessor.Load (new XmlTextReader (new StringReader (
1153 string.Format (xsltFragment, ""))),
1154 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1155 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
1158 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
1159 "<test><something><else /></something></test>", sw.ToString (),
1164 [Category ("NotWorking")] // bug #77081: mono does not output newline and indentation for non-html elements
1165 public void Output_Indent_Html ()
1167 XsltArgumentList xsltArgs = new XsltArgumentList ();
1168 XslTransform xsltProcessor = new XslTransform ();
1170 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
1171 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
1175 <xsl:template match=""/"">
1176 <xsl:element name=""html"">
1177 <xsl:element name=""body"">
1178 <xsl:element name=""p"" />
1179 <xsl:element name=""p"">
1180 <xsl:text>something</xsl:text>
1182 <xsl:element name=""p"">
1183 <xsl:element name=""div"" />
1185 <xsl:element name=""p"">
1186 <xsl:element name=""whatever"" />
1193 XmlDocument xmlDoc = new XmlDocument ();
1194 xmlDoc.LoadXml ("<dummy />");
1196 // set indent to yes
1197 StringWriter sw = new StringWriter ();
1198 xsltProcessor.Load (new XmlTextReader (new StringReader (
1199 string.Format (xsltFragment, "indent=\"yes\""))),
1200 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1201 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
1203 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
1208 " <p>something</p>{0}" +
1218 "</html>", Environment.NewLine), sw.ToString (), "#1");
1221 sw.GetStringBuilder ().Length = 0;
1222 xsltProcessor.Load (new XmlTextReader (new StringReader (
1223 string.Format (xsltFragment, "indent=\"no\""))),
1224 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1225 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
1227 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
1228 "<html><body><p></p><p>something</p><p><div></div></p>" +
1229 "<p><whatever></whatever></p></body></html>",
1230 Environment.NewLine), sw.ToString (), "#2");
1233 sw.GetStringBuilder ().Length = 0;
1234 xsltProcessor.Load (new XmlTextReader (new StringReader (
1235 string.Format (xsltFragment, ""))),
1236 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1237 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
1239 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
1244 " <p>something</p>{0}" +
1254 "</html>", Environment.NewLine), sw.ToString (), "#3");
1258 [ExpectedException (typeof (XsltCompileException))]
1259 public void Output_Indent_Invalid ()
1261 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
1262 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
1263 <xsl:output indent=""Yes"" />
1265 XslTransform xsltProcessor = new XslTransform ();
1266 xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
1267 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1271 [ExpectedException (typeof (XsltCompileException))]
1272 public void Output_Indent_Empty ()
1274 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
1275 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
1276 <xsl:output indent="""" />
1278 XslTransform xsltProcessor = new XslTransform ();
1279 xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
1280 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1284 public void Output_Indent_ForwardsCompatible ()
1286 StringWriter sw = new StringWriter ();
1287 XsltArgumentList xsltArgs = new XsltArgumentList ();
1288 XslTransform xsltProcessor = new XslTransform ();
1289 XmlDocument xmlDoc = new XmlDocument ();
1290 xmlDoc.LoadXml ("<dummy />");
1292 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
1293 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.5"">
1294 <xsl:output indent=""{0}"" />
1295 <xsl:template match=""/"">
1301 xsltProcessor.Load (new XmlTextReader (new StringReader (
1302 string.Format (xsltFragment, "Yes"))),
1303 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1304 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
1307 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
1308 "<root />", sw.ToString (), "#1");
1311 sw.GetStringBuilder ().Length = 0;
1312 xsltProcessor.Load (new XmlTextReader (new StringReader (
1313 string.Format (xsltFragment, ""))),
1314 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1315 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
1318 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
1319 "<root />", sw.ToString (), "#2");
1323 public void Output_MediaType ()
1325 StringWriter sw = null;
1326 XsltArgumentList xsltArgs = new XsltArgumentList ();
1327 XslTransform xsltProcessor = new XslTransform ();
1329 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
1330 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
1331 <xsl:output media-type=""whatever"" />
1332 <xsl:template match=""/"">
1337 XmlDocument xmlDoc = new XmlDocument ();
1338 xmlDoc.LoadXml ("<dummy />");
1340 sw = new StringWriter ();
1341 xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
1342 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1343 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
1346 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
1347 "<root />", sw.ToString ());
1351 public void Output_Encoding_TextWriter ()
1353 StringWriter sw = null;
1354 XsltArgumentList xsltArgs = new XsltArgumentList ();
1355 XslTransform xsltProcessor = new XslTransform ();
1357 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
1358 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
1360 <xsl:template match=""/"">
1365 XmlDocument xmlDoc = new XmlDocument ();
1366 xmlDoc.LoadXml ("<dummy />");
1369 sw = new StringWriter ();
1370 xsltProcessor.Load (new XmlTextReader (new StringReader (
1371 string.Format (xsltFragment, string.Empty))),
1372 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1373 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
1376 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
1377 "<root />", sw.ToString (), "#1");
1380 sw.GetStringBuilder ().Length = 0;
1381 xsltProcessor.Load (new XmlTextReader (new StringReader (
1382 string.Format(xsltFragment, "encoding=\"iso-8859-1\""))),
1383 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1384 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
1387 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
1388 "<root />", sw.ToString (), "#1");
1391 sw.GetStringBuilder ().Length = 0;
1392 xsltProcessor.Load (new XmlTextReader (new StringReader (
1393 string.Format (xsltFragment, "encoding=\"doesnotexist\""))),
1394 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1395 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
1398 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
1399 "<root />", sw.ToString (), "#2");
1402 sw.GetStringBuilder ().Length = 0;
1403 xsltProcessor.Load (new XmlTextReader (new StringReader (
1404 string.Format (xsltFragment, "encoding=\"\""))),
1405 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1406 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
1409 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
1410 "<root />", sw.ToString (), "#3");
1414 public void Output_Encoding_Stream ()
1416 MemoryStream ms = null;
1417 string result = null;
1418 XsltArgumentList xsltArgs = new XsltArgumentList ();
1419 XslTransform xsltProcessor = new XslTransform ();
1421 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
1422 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
1424 <xsl:template match=""/"">
1429 XmlDocument xmlDoc = new XmlDocument ();
1430 xmlDoc.LoadXml ("<dummy />");
1433 ms = new MemoryStream ();
1434 xsltProcessor.Load (new XmlTextReader (new StringReader (
1435 string.Format (xsltFragment, string.Empty))),
1436 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1437 xsltProcessor.Transform (xmlDoc, xsltArgs, ms, new XmlUrlResolver ());
1439 using (StreamReader sr = new StreamReader (ms, true)) {
1440 result = sr.ReadToEnd ();
1444 "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
1445 "<root />", result, "#1");
1448 ms = new MemoryStream ();
1449 xsltProcessor.Load (new XmlTextReader (new StringReader (
1450 string.Format (xsltFragment, "encoding=\"iso-8859-1\""))),
1451 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1452 xsltProcessor.Transform (xmlDoc, xsltArgs, ms, new XmlUrlResolver ());
1454 using (StreamReader sr = new StreamReader (ms, true)) {
1455 result = sr.ReadToEnd ();
1459 "<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>" +
1460 "<root />", result, "#2");
1463 ms = new MemoryStream ();
1464 xsltProcessor.Load (new XmlTextReader (new StringReader (
1465 string.Format (xsltFragment, "encoding=\"doesnotexist\""))),
1466 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1467 xsltProcessor.Transform (xmlDoc, xsltArgs, ms, new XmlUrlResolver ());
1469 using (StreamReader sr = new StreamReader (ms, true)) {
1470 result = sr.ReadToEnd ();
1474 "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
1475 "<root />", result, "#3");
1478 ms = new MemoryStream ();
1479 xsltProcessor.Load (new XmlTextReader (new StringReader (
1480 string.Format (xsltFragment, "encoding=\"\""))),
1481 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1482 xsltProcessor.Transform (xmlDoc, xsltArgs, ms, new XmlUrlResolver ());
1484 using (StreamReader sr = new StreamReader (ms, true)) {
1485 result = sr.ReadToEnd ();
1489 "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
1490 "<root />", result, "#4");
1494 public void Output_Version ()
1496 StringWriter sw = null;
1497 XsltArgumentList xsltArgs = new XsltArgumentList ();
1498 XslTransform xsltProcessor = new XslTransform ();
1500 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
1501 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
1502 <xsl:output version=""{0}"" />
1503 <xsl:template match=""/"">
1508 XmlDocument xmlDoc = new XmlDocument ();
1509 xmlDoc.LoadXml ("<dummy />");
1512 sw = new StringWriter ();
1513 xsltProcessor.Load (new XmlTextReader (new StringReader (
1514 string.Format (xsltFragment, "1.0"))),
1515 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1516 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
1519 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
1520 "<root />", sw.ToString (), "#1");
1523 sw.GetStringBuilder ().Length = 0;
1524 xsltProcessor.Load (new XmlTextReader (new StringReader (
1525 string.Format (xsltFragment, "2.0"))),
1526 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1527 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
1530 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
1531 "<root />", sw.ToString (), "#2");
1534 sw.GetStringBuilder ().Length = 0;
1535 xsltProcessor.Load (new XmlTextReader (new StringReader (
1536 string.Format (xsltFragment, "BLABLA"))),
1537 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1538 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
1541 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
1542 "<root />", sw.ToString (), "#3");
1546 public void Output_Method_Html_TextWriter ()
1548 string options = null;
1549 StringWriter sw = null;
1550 XsltArgumentList xsltArgs = new XsltArgumentList ();
1551 XslTransform xsltProcessor = new XslTransform ();
1553 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
1554 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
1555 <xsl:output method=""html"" {0} />
1556 <xsl:template match=""/"">
1557 <xsl:element name=""html"">
1558 <xsl:element name=""head"">
1559 <xsl:element name=""title"">Output Test</xsl:element>
1561 <xsl:element name=""Body"">
1562 <xsl:element name=""BR"" />
1568 XmlDocument xmlDoc = new XmlDocument ();
1569 xmlDoc.LoadXml ("<dummy />");
1571 // indent not set, media-type not set
1572 sw = new StringWriter ();
1573 xsltProcessor.Load (new XmlTextReader (new StringReader (
1574 string.Format (xsltFragment, string.Empty))),
1575 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1576 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
1578 Assert.AreEqual (string.Format(CultureInfo.InvariantCulture,
1581 "{1}{1}<META http-equiv=\"Content-Type\" content=\"text/html; charset=utf-16\">{0}" +
1582 "{1}{1}<title>Output Test</title>{0}" +
1587 "</html>", Environment.NewLine, " "), sw.ToString (), "#1");
1589 // indent no, media-type not set
1590 options = "indent=\"no\"";
1591 sw.GetStringBuilder ().Length = 0;
1592 xsltProcessor.Load (new XmlTextReader (new StringReader (
1593 string.Format (xsltFragment, options))),
1594 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1595 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
1597 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
1600 "{1}{1}<META http-equiv=\"Content-Type\" content=\"text/html; charset=utf-16\">{0}" +
1601 "{1}{1}<title>Output Test</title>{0}" +
1606 "</html>", string.Empty, string.Empty), sw.ToString (), "#2");
1608 // indent yes, media-type "bla", omit-xml-declaration "no"
1609 options = "indent=\"yes\" media-type=\"bla\"" +
1610 " encoding=\"iso-8859-1\" omit-xml-declaration=\"no\"";
1611 sw.GetStringBuilder ().Length = 0;
1612 xsltProcessor.Load (new XmlTextReader (new StringReader (
1613 string.Format (xsltFragment, options))),
1614 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1615 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
1617 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
1620 "{1}{1}<META http-equiv=\"Content-Type\" content=\"bla; charset=utf-16\">{0}" +
1621 "{1}{1}<title>Output Test</title>{0}" +
1626 "</html>", Environment.NewLine, " "), sw.ToString (), "#3");
1630 public void Output_Method_Html_Stream ()
1632 string options = null;
1633 MemoryStream ms = null;
1634 string result = null;
1635 XsltArgumentList xsltArgs = new XsltArgumentList ();
1636 XslTransform xsltProcessor = new XslTransform ();
1638 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
1639 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
1640 <xsl:output method=""html"" {0} />
1641 <xsl:template match=""/"">
1642 <xsl:element name=""html"">
1643 <xsl:element name=""head"">
1644 <xsl:element name=""title"">Output Test</xsl:element>
1646 <xsl:element name=""Body"">
1647 <xsl:element name=""BR"" />
1653 XmlDocument xmlDoc = new XmlDocument ();
1654 xmlDoc.LoadXml ("<dummy />");
1656 // indent not set, media-type not set
1657 ms = new MemoryStream ();
1658 xsltProcessor.Load (new XmlTextReader (new StringReader (
1659 string.Format (xsltFragment, string.Empty))),
1660 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1661 xsltProcessor.Transform (xmlDoc, xsltArgs, ms, new XmlUrlResolver ());
1663 using (StreamReader sr = new StreamReader (ms, true)) {
1664 result = sr.ReadToEnd ();
1667 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
1670 "{1}{1}<META http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">{0}" +
1671 "{1}{1}<title>Output Test</title>{0}" +
1676 "</html>", Environment.NewLine, " "), result, "#1");
1678 // indent no, media-type not set
1679 options = "indent=\"no\"";
1680 ms = new MemoryStream ();
1681 xsltProcessor.Load (new XmlTextReader (new StringReader (
1682 string.Format (xsltFragment, options))),
1683 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1684 xsltProcessor.Transform (xmlDoc, xsltArgs, ms, new XmlUrlResolver ());
1686 using (StreamReader sr = new StreamReader (ms, true)) {
1687 result = sr.ReadToEnd ();
1690 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
1693 "{1}{1}<META http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">{0}" +
1694 "{1}{1}<title>Output Test</title>{0}" +
1699 "</html>", string.Empty, string.Empty), result, "#2");
1701 // indent yes, media-type "bla", omit-xml-declaration "no"
1702 options = "indent=\"yes\" media-type=\"bla\"" +
1703 " encoding=\"iso-8859-1\" omit-xml-declaration=\"no\"";
1704 ms = new MemoryStream ();
1705 xsltProcessor.Load (new XmlTextReader (new StringReader (
1706 string.Format (xsltFragment, options))),
1707 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1708 xsltProcessor.Transform (xmlDoc, xsltArgs, ms, new XmlUrlResolver ());
1710 using (StreamReader sr = new StreamReader (ms, true)) {
1711 result = sr.ReadToEnd ();
1714 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
1717 "{1}{1}<META http-equiv=\"Content-Type\" content=\"bla; charset=iso-8859-1\">{0}" +
1718 "{1}{1}<title>Output Test</title>{0}" +
1723 "</html>", Environment.NewLine, " "), result, "#3");
1727 [ExpectedException (typeof (XsltCompileException))]
1728 public void Output_Unknown_Attribute ()
1730 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
1731 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
1732 <xsl:output whatever="""" />
1734 XslTransform xsltProcessor = new XslTransform ();
1735 xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
1736 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1740 public void Output_Unknown_Attribute_ForwardsCompatible ()
1742 StringWriter sw = new StringWriter ();
1743 XsltArgumentList xsltArgs = new XsltArgumentList ();
1744 XslTransform xsltProcessor = new XslTransform ();
1745 XmlDocument xmlDoc = new XmlDocument ();
1746 xmlDoc.LoadXml ("<dummy />");
1748 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
1749 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.5"">
1750 <xsl:output whatever="""" />
1751 <xsl:template match=""/"">
1756 xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
1757 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1758 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
1761 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
1762 "<root />", sw.ToString (), "#1");
1766 public void Output_Unknown_Attribute_NonDefaultNamespace ()
1768 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
1769 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" xmlns:tst=""something"" version=""1.0"">
1770 <xsl:output tst:whatever="""" />
1772 XslTransform xsltProcessor = new XslTransform ();
1773 xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
1774 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1777 // http://support.microsoft.com/kb/832757/en-us
1779 public void FormatNumber_KB_832757 ()
1781 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8""?>
1782 <xsl:stylesheet version=""1.0"" xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"">
1783 <xsl:output method=""xml"" version=""1.0"" encoding=""UTF-8"" indent=""yes"" />
1784 <xsl:template match=""/"">
1786 <xsl:apply-templates />
1789 <xsl:template match=""number"">
1790 <tr><td><xsl:value-of select=""format-number(.,'#,##0;(#,##0)')""/></td></tr>
1794 XmlDocument xmlDoc = new XmlDocument ();
1795 xmlDoc.LoadXml ("<root><number>1000</number></root>");
1797 StringWriter sw = new StringWriter ();
1798 XslTransform xsltProcessor = new XslTransform ();
1799 xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
1800 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1801 xsltProcessor.Transform (xmlDoc, new XsltArgumentList (), sw,
1802 new XmlUrlResolver ());
1804 Assert.AreEqual (string.Format(CultureInfo.InvariantCulture,
1805 "<?xml version=\"1.0\" encoding=\"utf-16\"?>{0}" +
1808 " <td>1,000</td>{0}" +
1810 "</table>", Environment.NewLine), sw.ToString ());
1813 // http://support.microsoft.com/kb/293469/en-us
1815 public void FormatNumber_KB_293469 ()
1817 string xsltFragment = @"<?xml version=""1.0""?>
1818 <xsl:stylesheet version=""1.0"" xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"">
1819 <xsl:output method=""xml"" indent=""yes"" />
1820 <xsl:decimal-format name=""european"" decimal-separator="","" grouping-separator=""."" />
1821 <xsl:template match=""/"">
1822 <xsl:element name=""html"">
1823 <xsl:element name=""body"">
1824 <xsl:apply-templates select=""root/amount"" />
1828 <xsl:template match=""amount"">
1829 <xsl:value-of select=""format-number(., '###.###,00', 'european')""/>
1833 XmlDocument xmlDoc = new XmlDocument ();
1834 xmlDoc.LoadXml ("<root><amount currency='USD'>44442.7</amount></root>");
1836 StringWriter sw = new StringWriter ();
1837 XslTransform xsltProcessor = new XslTransform ();
1838 xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
1839 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1840 xsltProcessor.Transform (xmlDoc, new XsltArgumentList (), sw,
1841 new XmlUrlResolver ());
1843 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
1844 "<?xml version=\"1.0\" encoding=\"utf-16\"?>{0}" +
1846 " <body>44.442,70</body>{0}" +
1847 "</html>", Environment.NewLine), sw.ToString ());
1851 [Category ("NotDotNet")]
1852 // MS bug: the output must be well-formed XML general entity
1853 // (doctype must not appear after text nodes).
1854 public void DocTypeAfterText ()
1857 <xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
1858 <xsl:output doctype-system='system'/>
1859 <xsl:template match='/'>
1860 <xsl:text xml:space='preserve'> a </xsl:text>
1864 XslTransform t = new XslTransform ();
1865 t.Load (new XmlTextReader (xsl, XmlNodeType.Document, null));
1866 XmlDocument doc = new XmlDocument ();
1868 t.Transform (new XPathDocument (
1869 new StringReader ("<root/>")),
1870 null, TextWriter.Null);
1871 Assert.Fail ("should fail; doctype is not allowed after whitespace. See XSLT 1.0 section 16.1.");
1877 public void StripSpace ()
1891 XslTransform t = new XslTransform ();
1892 t.Load ("Test/XmlFiles/xsl/stripspace.xsl");
1893 XPathDocument d = new XPathDocument (
1894 "Test/XmlFiles/xsl/stripspace.xml", XmlSpace.Preserve);
1895 StringWriter sw = new StringWriter ();
1896 t.Transform (d, null, sw);
1897 Assert.AreEqual (result, sw.ToString ());
1901 public void CurrentInSelect ()
1903 XslTransform t = new XslTransform ();
1904 t.Load ("Test/XmlFiles/xsl/current-in-select.xsl");
1905 XPathDocument d = new XPathDocument (
1906 "Test/XmlFiles/xsl/current-in-select.xml", XmlSpace.Preserve);
1907 StringWriter sw = new StringWriter ();
1908 t.Transform (d, null, sw);
1909 using (StreamReader sr = File.OpenText (
1910 "Test/XmlFiles/xsl/current-in-select.ref")) {
1911 string s = sr.ReadToEnd ();
1912 Assert.AreEqual (s, sw.ToString ());
1917 public void CallTemplateSignificantWhitespace ()
1920 string xsl = @"<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
1921 <xsl:template name='foo' xml:space='preserve'>
1922 <xsl:call-template name='bar'>
1923 <xsl:with-param name='hoge' select='hoge' />
1924 </xsl:call-template>
1927 <xsl:template name='bar'>
1930 XslTransform t = new XslTransform ();
1931 t.Load (new XmlTextReader (new StringReader (xsl)));
1932 t.Transform (new XPathDocument (new StringReader ("<dummy/>")), null, new XmlTextWriter (TextWriter.Null));
1936 public void Bug82493 ()
1938 XslTransform transformationObj = new XslTransform ();
1939 transformationObj.Load ("Test/XmlFiles/xsl/82493.xsl");
1940 XmlDocument doc = new XmlDocument ();
1941 doc.Load ("Test/XmlFiles/xsl/82493.xml");
1942 XslExtensionClass GetCalculation = new XslExtensionClass ("a4");
1943 XsltArgumentList xslExtensionArgList = new XsltArgumentList ();
1944 xslExtensionArgList.AddExtensionObject ("urn:e", GetCalculation);
1945 XmlTextWriter writer = new XmlTextWriter (TextWriter.Null);
1946 transformationObj.Transform (doc, xslExtensionArgList, writer, null);
1951 public void BugNovell325482 ()
1953 XmlDocument doc = new XmlDocument ();
1954 doc.Load ("Test/XmlFiles/xsl/325482.xml");
1955 XslTransform xt = new XslTransform ();
1956 xt.Load ("Test/XmlFiles/xsl/325482.xsl");
1957 xt.Transform (doc, null, TextWriter.Null);
1960 public class XslExtensionClass
1962 private string paperType = String.Empty;
1964 public XslExtensionClass (string paperType)
1966 this.paperType = paperType;
1969 public int GetPageDimensions ()
1971 switch (this.paperType) {
1977 throw new ArgumentException ("Unknown page size type: " + this.paperType);
1982 [Test] // bug #348786
1983 public void ValueOfContainsExternalElements ()
1986 <xsl:stylesheet version=""1.0"" xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"">
1987 <xsl:template match=""x"">
1989 <xsl:value-of select=""@bar"">
1990 <!-- enter comment here -->
1995 new XslTransform ().Load (new XmlTextReader (xsl, XmlNodeType.Document, null));
1998 [Test] // bug #349035
1999 public void CompareRTFAsStringNotNodeset ()
2001 XslTransform xslt = new XslTransform ();
2002 xslt.Load (new XmlTextReader (new StringReader (@"
2003 <xsl:stylesheet version=""1.0""
2004 xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"">
2005 <xsl:template name=""foo"">
2006 <xsl:param name=""bar""/>
2007 <xsl:if test=""$bar!=''"">
2008 <bar>bar is not empty:'<xsl:value-of select=""$bar""/>'</bar>
2010 <xsl:if test=""$bar=''"">
2011 <bar>bar is empty</bar>
2014 <xsl:template match=""zap"">
2015 <xsl:call-template name=""foo"">
2016 <xsl:with-param name=""bar"">
2017 <xsl:for-each select=""@bar"">
2018 <xsl:value-of select="".""/>
2021 </xsl:call-template>
2025 XPathDocument input = new XPathDocument (new StringReader (
2031 StringWriter sw = new StringWriter ();
2032 XmlTextWriter xtw = new XmlTextWriter (sw);
2033 xslt.Transform (input, null, xtw);
2034 string expected = "<bar>bar is not empty:'HaHa'</bar><bar>bar is empty</bar>";
2035 Assert.AreEqual (expected, sw.ToString ());
2039 public void Bug349111 ()
2041 XslTransform xslt = new XslTransform ();
2042 xslt.Load (new XmlTextReader (new StringReader (@"
2043 <xsl:stylesheet version=""1.0"" xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"">
2044 <xsl:template match=""book"">
2045 <xsl:for-each select=""child::node()[position()]"">
2047 <xsl:value-of select="".""/>
2053 XPathDocument input = new XPathDocument (new StringReader (@"
2055 <book> <title lang=""eng"">Harry Potter</title> <price>29.99</price> </book>
2058 StringWriter sw = new StringWriter ();
2059 xslt.Transform (input, null, new XmlTextWriter (sw));
2060 string expected = "<yyy>Harry Potter</yyy><yyy>29.99</yyy>";
2061 Assert.AreEqual (expected, sw.ToString ());
2065 public void Bug351939 ()
2067 XslTransform xslt = new XslTransform ();
2068 xslt.Load (new XmlTextReader (new StringReader (
2069 @"<xsl:stylesheet version=""1.0""
2070 xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"">
2071 <xsl:key name=""thekey"" match=""aa"" use=""''""/>
2072 <xsl:key name=""thekey"" match=""ab"" use=""''""/>
2073 <xsl:template match=""root"">
2075 <foo><xsl:value-of select=""key('thekey','')[1]""/></foo>
2076 <bar><xsl:value-of select=""key('thekey','')[2]""/></bar>
2077 <baz><xsl:value-of select=""key('thekey','')[3]""/></baz>
2078 <tem><xsl:value-of select=""key('thekey','')[4]""/></tem>
2081 </xsl:stylesheet>")));
2082 StringWriter sw = new StringWriter ();
2083 xslt.Transform (new XPathDocument (new StringReader (
2084 @"<?xml version=""1.0""?>
2094 </root>")), null, new XmlTextWriter (sw));
2095 Assert.AreEqual ("<x><foo>1</foo><bar>2</bar><baz>3</baz><tem>4</tem></x>", sw.ToString ());
2099 public void CopyOfIXPathNavigable ()
2102 <xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'
2103 xmlns:foo='urn:Foo'>
2104 <xsl:template match='/'>
2105 <xsl:copy-of select='foo:MyCustomFunction()'/>
2111 <given-name age='10'>
2113 <nick-name>Freddy</nick-name>
2115 <family-name>Smith</family-name>
2118 <given-name age='10'>
2120 <nick-name>Bob</nick-name>
2122 <family-name>Smith</family-name>
2125 XslTransform t = new XslTransform ();
2126 t.Load (new XPathDocument (new StringReader (xsl)));
2127 XsltArgumentList args = new XsltArgumentList();
2128 args.AddExtensionObject ("urn:Foo", new CopyOfIXPathNavigableClass ());
2129 StringWriter sw = new StringWriter ();
2130 t.Transform (new XPathDocument (new StringReader (xml)), args, new XmlTextWriter (sw));
2131 Assert.AreEqual ("<root><child0 /><child1 /></root>", sw.ToString ());
2134 public class CopyOfIXPathNavigableClass
2136 public object MyCustomFunction ()
2138 XmlDocument doc = new XmlDocument ();
2139 doc .LoadXml ("<root><child0 /><child1 /></root>");
2140 return doc.DocumentElement;
2144 [Test] // bug #316238
2145 public void ResolveVariableInXsltArgumentList ()
2147 ResolveVariableInXsltArgumentList ("Test/XmlFiles/xsl/316238-1.xsl");
2148 ResolveVariableInXsltArgumentList ("Test/XmlFiles/xsl/316238-2.xsl");
2151 void ResolveVariableInXsltArgumentList (string file)
2153 XmlDocument doc = new XmlDocument ();
2154 doc.LoadXml ("<doc><element id=\"test\">this is a test</element></doc>");
2155 XslTransform transform = new XslTransform ();
2156 transform.Load (file);
2157 //Stream outputStream = Console.OpenStandardOutput();
2158 XsltArgumentList xsltArgs = new XsltArgumentList ();
2159 xsltArgs.AddParam ("test", "", "test");
2160 xsltArgs.AddParam ("doc", "", doc.CreateNavigator().Select ("*"));
2161 transform.Transform (new XmlDocument (), xsltArgs, TextWriter.Null);
2164 [Test] // bug #378239
2165 public void WhitespaceEntityInStylesheet ()
2167 string xslt = @"<?xml version='1.0' encoding='UTF-8'?>
2168 <!DOCTYPE xsl:stylesheet [
2172 <xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'>
2173 <xsl:output method='text' omit-xml-declaration='yes'/>
2175 <xsl:template match='/'>
2176 <xsl:text>&nl;Hello&nl;World</xsl:text>
2179 string expected = @"
2182 XslTransform t = new XslTransform ();
2183 t.Load (new XPathDocument (new StringReader (xslt)));
2184 StringWriter sw = new StringWriter ();
2185 t.Transform (new XPathDocument (new StringReader ("<test/>")), null, sw);
2186 Assert.AreEqual (expected, sw.ToString ());
2189 [Test] // bug #556619
2190 public void RejectCurrencySymbolAsNumber ()
2192 XslTransform xslt = new XslTransform ();
2193 StringWriter sw = new StringWriter ();
2195 @"<?xml version=""1.0""?>
2199 xmlns:xsl=""http://www.w3.org/1999/XSL/Transform""
2202 <xsl:template name=""F"">
2203 <xsl:param name=""p""/>
2205 <xsl:when test=""number($p)"">
2206 YES <xsl:value-of select=""number($p)""/>
2213 <xsl:template match=""/"">
2214 <xsl:call-template name=""F"">
2215 <xsl:with-param name=""p"">$4$2</xsl:with-param>
2216 </xsl:call-template>
2220 xslt.Load (new XmlTextReader (new StringReader (s)));
2221 xslt.Transform (new XPathDocument (new StringReader (
2222 @"<?xml version=""1.0""?>
2224 </root>")), null, sw);
2225 Assert.IsTrue (sw.ToString ().IndexOf ("NO") > 0);
2229 [Test] // bug #349375
2230 public void PreserveWhitespace ()
2232 XslCompiledTransform xslt = new XslCompiledTransform ();
2233 xslt.Load (new XmlTextReader (new StringReader (@"
2236 xmlns:xsl=""http://www.w3.org/1999/XSL/Transform""
2238 <xsl:output omit-xml-declaration='yes' />
2239 <xsl:strip-space elements='*'/>
2240 <xsl:preserve-space elements='p span'/>
2242 <xsl:template name='foo'>
2243 <xsl:for-each select='node()'>
2244 <xsl:attribute name='yes-one-node'/>
2245 <xsl:value-of select='.'/>
2247 <xsl:if test='not(node())'>
2248 <xsl:attribute name='not-node'/>
2249 <xsl:value-of select='.'/>
2253 <xsl:template match='p'>
2255 <xsl:for-each select='child::node()[position()]'>
2257 <xsl:when test='name()=""span""'>
2259 <xsl:call-template name='foo'/>
2267 </xsl:stylesheet>")));
2268 StringWriter sw = new StringWriter ();
2269 xslt.Transform (new XmlTextReader (new StringReader (@"
2277 </root>")), null, sw);
2278 Assert.AreEqual (@"<y><t yes-one-node="""">1</t><t yes-one-node=""""> </t></y>", sw.ToString ());
2281 [Test] // reverse case of #349375
2282 [Category ("NotWorking")]
2283 // [Category ("NotDotNet")]
2284 public void PreserveWhitespace2 ()
2286 XslCompiledTransform xslt = new XslCompiledTransform ();
2287 xslt.Load (new XmlTextReader (new StringReader (@"
2290 xmlns:xsl=""http://www.w3.org/1999/XSL/Transform""
2292 <xsl:output omit-xml-declaration='yes' />
2293 <xsl:preserve-space elements='*'/>
2294 <xsl:strip-space elements='p span'/>
2296 <xsl:template name='foo'>
2297 <xsl:for-each select='node()'>
2298 <xsl:attribute name='yes-one-node'/>
2299 <xsl:value-of select='.'/>
2301 <xsl:if test='not(node())'>
2302 <xsl:attribute name='not-node'/>
2303 <xsl:value-of select='.'/>
2307 <xsl:template match='p'>
2309 <xsl:for-each select='child::node()[position()]'>
2311 <xsl:when test='name()=""span""'>
2313 <xsl:call-template name='foo'/>
2321 </xsl:stylesheet>")));
2322 StringWriter sw = new StringWriter ();
2323 xslt.Transform (new XmlTextReader (new StringReader (@"
2331 </root>")), null, sw);
2332 // Assert.AreEqual (@"<y><t yes-one-node="""">1</t><t not-node=""""></t></y>", sw.ToString ());
2333 Assert.AreEqual ("\r\n \r\n <y><t yes-one-node=\"\">1</t><t not-node=\"\"></t></y>\r\n \r\n", sw.ToString ());
2337 public void CompiledTransform_Fragment () // bug #391424
2339 XslCompiledTransform xslTransform = new XslCompiledTransform ();
2340 XsltSettings settings = new XsltSettings ();
2341 settings.EnableDocumentFunction = true;
2342 xslTransform.Load ("Test/XmlFiles/xsl/391424.xsl", settings, new XmlUrlResolver ());
2343 StringWriter sw = new StringWriter ();
2344 xslTransform.Transform (new XPathDocument ("Test/XmlFiles/xsl/391424.xml", XmlSpace.Preserve), null, sw);
2345 Assert.AreEqual ("<?xml version=\"1.0\" encoding=\"utf-16\"?>Document found", sw.ToString ());
2349 public void XslTextElement_PreservesWhitespace () // bug 450797
2351 XslCompiledTransform xslt = new XslCompiledTransform ();
2352 xslt.Load (new XmlTextReader (new StringReader (@"
2354 xmlns:xsl=""http://www.w3.org/1999/XSL/Transform""
2356 <xsl:output method='text' omit-xml-declaration='yes'/>
2357 <xsl:template match='foo'>
2358 <xsl:text> </xsl:text>
2360 </xsl:stylesheet>")));
2361 StringWriter sw = new StringWriter ();
2362 xslt.Transform (new XmlTextReader (new StringReader (@"<foo>bar</foo>")), null, sw);
2363 Assert.AreEqual (" ", sw.ToString ());
2367 public void Bug487065 ()
2369 using (XmlReader input = GetInput ()) {
2370 using (XmlWriter output = XmlWriter.Create (Path.Combine(Path.GetTempPath(), "out.xml"))) {
2371 PreProcess (input, output);
2372 Assert.IsTrue (valueHasBeenSet, "#1");
2377 private static XmlReader GetInput ()
2379 return XmlReader.Create (new StringReader ("<cb:config-template xmlns:cb=\"urn:ccnet.config.builder\"><cb:define name=\"var1\">value1</cb:define></cb:config-template>"));
2382 private void PreProcess (XmlReader input, XmlWriter output)
2384 var xsltsettings = new XsltSettings (true, true);
2385 var xsltpreprocess = new XslCompiledTransform (true);
2388 new StringReader (@"
2389 <xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'
2390 xmlns:msxsl='urn:schemas-microsoft-com:xslt'
2391 xmlns:cb='urn:ccnet.config.builder'
2392 xmlns:env='environment'
2393 xmlns:exsl='http://exslt.org/common'
2394 exclude-result-prefixes='msxsl cb env exsl'>
2395 <xsl:template match='cb:define[not(*) and @name]'>
2396 <xsl:for-each select='env:define_text_constant(@name,.)'/>
2398 </xsl:stylesheet>");
2400 using (XmlReader xsltreader = XmlReader.Create (stream))
2401 xsltpreprocess.Load (xsltreader, xsltsettings, new XmlUrlResolver());
2403 var xsltargs = new XsltArgumentList ();
2405 // The XSLT calls extension functions in _current_env.
2406 xsltargs.AddExtensionObject ("environment", this);
2407 xsltpreprocess.Transform (input, xsltargs, output, null);
2410 public void define_text_constant (string name, string value)
2412 Assert.AreEqual("var1", name, "#a1");
2413 Assert.AreEqual("value1", value, "#a2");
2414 valueHasBeenSet = true;
2417 private bool valueHasBeenSet;