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 string output = Path.Combine (Path.GetTempPath (), "result.xml");
40 doc.LoadXml ("<root/>");
41 xslt.Load ("Test/XmlFiles/xsl/empty.xsl");
42 xslt.Transform ("Test/XmlFiles/xsl/empty.xsl", output);
44 Assert.AreEqual (2, result.ChildNodes.Count, "count");
48 [ExpectedException (typeof (XsltCompileException))]
49 public void InvalidStylesheet ()
51 XmlDocument doc = new XmlDocument ();
52 doc.LoadXml ("<xsl:element xmlns:xsl='http://www.w3.org/1999/XSL/Transform' />");
53 XslTransform t = new XslTransform ();
58 [ExpectedException (typeof (XsltCompileException))]
59 public void EmptyStylesheet ()
61 XmlDocument doc = new XmlDocument ();
62 XslTransform t = new XslTransform ();
67 [ExpectedException (typeof (XsltCompileException))]
68 public void InvalidStylesheet2 ()
70 string xsl = @"<xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'>
71 <xsl:template match='/root'>
72 <xsl:call-template name='foo'>
73 <xsl:with-param name='name' value='text()' />
76 <xsl:template name='foo'>
77 <xsl:param name='name' />
80 <xsl:variable name='last' value='text()' />
81 <xsl:value-of select='$last' />
87 XslTransform xslt = new XslTransform ();
88 xslt.Load (new XPathDocument (new XmlTextReader (xsl, XmlNodeType.Document, null)));
92 [Category ("NotWorking")] // it depends on "mcs" existence
93 public void MsxslTest() {
94 string _styleSheet = @"
95 <xslt:stylesheet xmlns:xslt=""http://www.w3.org/1999/XSL/Transform"" version=""1.0""
96 xmlns:msxsl=""urn:schemas-microsoft-com:xslt"" xmlns:stringutils=""urn:schemas-sourceforge.net-blah"">
97 <xslt:output method=""text"" />
98 <msxsl:script language=""C#"" implements-prefix=""stringutils"">
100 string PadRight( string str, int padding) {
101 return str.PadRight(padding);
105 <xslt:template match=""test"">
106 <xslt:value-of select=""stringutils:PadRight(@name, 20)"" />
110 StringReader stringReader = new StringReader(_styleSheet);
112 XslTransform transform = new XslTransform();
113 XmlTextReader reader = new XmlTextReader(stringReader);
114 transform.Load(reader, new XmlUrlResolver(), AppDomain.CurrentDomain.Evidence);
116 StringBuilder sb = new StringBuilder();
117 StringWriter writer = new StringWriter(sb, CultureInfo.InvariantCulture);
118 XsltArgumentList arguments = new XsltArgumentList();
120 XmlDocument xmlDoc = new XmlDocument();
121 xmlDoc.LoadXml("<test name=\"test\" />");
124 transform.Transform(xmlDoc, new XsltArgumentList(), writer, new XmlUrlResolver());
126 Assert.AreEqual ("test".PadRight(20), sb.ToString());
130 public void MSXslNodeSet ()
132 string xsl = @"<xsl:stylesheet version='1.0'
133 xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns:msxsl='urn:schemas-microsoft-com:xslt'>
134 <xsl:template match='/'>
136 <xsl:variable name='var'>
137 <xsl:copy-of select='root/foo' />
139 <xsl:for-each select='msxsl:node-set($var)/foo'>
140 <xsl:value-of select='name(.)' />: <xsl:value-of select='@attr' />
145 StringWriter sw = new StringWriter ();
146 XslTransform t = new XslTransform ();
147 t.Load (new XPathDocument (new StringReader (xsl)));
148 t.Transform (new XPathDocument (new XmlTextReader (new StringReader ("<root><foo attr='A'/><foo attr='B'/><foo attr='C'/></root>"))), null, sw);
149 Assert.AreEqual (@"<?xml version=""1.0"" encoding=""utf-16""?><root xmlns:msxsl=""urn:schemas-microsoft-com:xslt"">foo: Afoo: Bfoo: C</root>", sw.ToString ());
153 [Category ("NotDotNet")]
154 // Actually MS.NET here throws XsltException, but Mono returns
155 // XPathException (since XPath evaluation engine generally
156 // catches (should catch) static error. It is implementation
158 [ExpectedException (typeof (XPathException))]
159 public void MSXslNodeSetRejectsNodeSet ()
161 string xsl = @"<xsl:stylesheet version='1.0'
162 xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns:msxsl='urn:schemas-microsoft-com:xslt'>
163 <xsl:template match='/'>
165 <!-- msxsl:node-set() does not accept a node set -->
166 <xsl:for-each select='msxsl:node-set(root/foo)'>
167 <xsl:value-of select='name(.)' />: <xsl:value-of select='@attr' />
172 StringWriter sw = new StringWriter ();
173 XslTransform t = new XslTransform ();
174 t.Load (new XPathDocument (new StringReader (xsl)));
175 t.Transform (new XPathDocument (new XmlTextReader (new StringReader ("<root><foo attr='A'/><foo attr='B'/><foo attr='C'/></root>"))), null, sw);
179 public void EvaluateEmptyVariableAsBoolean ()
181 string xsl = @"<xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'>
182 <xsl:template match='/'>
183 <xsl:variable name='var'><empty /></xsl:variable>
184 <root><xsl:if test='$var'>true</xsl:if></root>
187 XslTransform t = new XslTransform ();
188 t.Load (new XPathDocument (new StringReader (xsl)));
189 StringWriter sw = new StringWriter ();
191 new XPathDocument (new StringReader ("<root/>")),
194 Assert.IsTrue (sw.ToString ().IndexOf ("true") > 0);
198 [ExpectedException (typeof (XsltCompileException))]
199 public void NotAllowedPatternAxis ()
201 string xsl = @"<xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'>
202 <xsl:template match='/descendant-or-self::node()/elem'>
206 new XslTransform ().Load (new XPathDocument (
207 new StringReader (xsl)));
211 [ExpectedException (typeof (XsltCompileException))]
212 public void ImportIncorrectlyLocated ()
214 string xsl = @"<xsl:transform xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'>
215 <xsl:template match='/'></xsl:template>
216 <xsl:import href='dummy.xsl' />
218 new XslTransform ().Load (new XPathDocument (
219 new StringReader (xsl)));
222 private WeakReference StylesheetLoad (XslTransform t, string xsl)
224 XPathDocument doc = new XPathDocument (
225 new StringReader (xsl));
226 WeakReference wr = new WeakReference (doc);
231 private WeakReference StylesheetTransform (XslTransform t, string xml)
233 XPathDocument doc = new XPathDocument (
234 new StringReader (xml));
235 WeakReference wr = new WeakReference (doc);
236 t.Transform (doc, null, TextWriter.Null, null);
242 public void ErrorOnDocumentResolution ()
244 // XslTransform recovers from errors on document resolution.
245 string xslText = @"<xsl:stylesheet
246 xmlns:xsl='http://www.w3.org/1999/XSL/Transform'
248 <xsl:variable name='n'
249 select='document(""notexist.xml"")' />
250 <xsl:template match='/'>xx</xsl:template>
252 string xmlText = @"<root />";
253 XslTransform transform = new XslTransform ();
254 XPathDocument doc = new XPathDocument (
255 new XmlTextReader ("a.xsl", new StringReader (xslText)));
256 transform.Load (doc);
257 XPathDocument xmlDocument = new XPathDocument (new StringReader (xmlText));
259 StringWriter sw = new StringWriter ();
260 transform.Transform (xmlDocument, null, sw);
263 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
264 "xx", sw.ToString ());
269 public void LoadStyleFromNonRoot ()
271 XmlDocument doc = new XmlDocument ();
272 XslTransform xslt = new XslTransform ();
273 doc.LoadXml ("<root><dummy /><xsl:transform xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0' /></root>");
274 XmlNode node = doc.ChildNodes [0].ChildNodes [1];
275 xslt.Load (node, null, null);
279 public void ReturnEmptyResultsAsXmlReader ()
282 XmlDocument doc = new XmlDocument ();
283 doc.LoadXml ("<xsl:transform xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0' />");
284 XslTransform xslt = new XslTransform ();
285 xslt.Load (doc, null, null);
286 XmlReader reader = xslt.Transform(doc, null, new XmlUrlResolver ());
289 // another case - with xsl:output standalone='yes'
290 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>");
291 xslt = new XslTransform ();
292 xslt.Load (doc, null, null);
293 reader = xslt.Transform (doc, null, new XmlUrlResolver ());
295 reader.Read (); // btw no XMLdecl output.
299 // http://www.w3.org/TR/xslt#section-Creating-Elements-with-xsl:element
300 // "If the namespace attribute is not present then the QName
301 // is expanded into an expanded-name using the namespace
302 // declarations in effect for the xsl:element element,
303 // including any default namespace declaration."
304 public void LREDefaultNamespace ()
306 string xsl = @"<xsl:stylesheet version='1.0' xmlns='urn:foo' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
307 <xsl:template match='/*'>
308 <xsl:element name='{local-name()}' />
311 string xml = "<root/>";
312 XslTransform t = new XslTransform ();
313 t.Load (new XPathDocument (new StringReader (xsl)));
314 StringWriter sw = new StringWriter ();
315 XmlTextWriter xw = new XmlTextWriter (sw);
317 new XPathDocument (new StringReader (xml)),
319 Assert.AreEqual ("<root xmlns=\"urn:foo\" />",
322 string xsl2 = @"<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns='urn:foo'>
323 <xsl:template match='/*'>
325 <xsl:element name='{local-name()}' />
329 string xml2 = "<page/>";
330 t.Load (new XPathDocument (new StringReader (xsl2)));
331 sw = new StringWriter ();
332 xw = new XmlTextWriter (sw);
334 new XPathDocument (new StringReader (xml2)),
336 Assert.AreEqual ("<root xmlns=\"urn:foo\"><page /></root>",
341 // http://lists.ximian.com/pipermail/mono-devel-list/2005-November/015812.html
342 public void WhitespaceHandling ()
344 string ref_out = @"XML
345 Extensible Markup language
348 Extensible Markup language
351 Extensible Markup language
354 Extensible Markup language
358 XmlDocument d = new XmlDocument ();
359 d.Load ("Test/XmlFiles/xsl/91834.xml");
361 XslTransform t = new XslTransform ();
362 t.Load ("Test/XmlFiles/xsl/91834.xsl");
364 StringWriter sw_raw = new StringWriter ();
365 t.Transform (d, null, sw_raw);
367 Assert.AreEqual (ref_out, sw_raw.ToString ().Replace ("\r\n", "\n"));
370 // http://support.microsoft.com/default.aspx?scid=kb;en-us;829014
372 public void EmptyNodeSetSort ()
374 string xmlFragment = @"<?xml version=""1.0"" encoding=""utf-8""?>
385 <SKILL>VB.NET</SKILL>
386 <SKILL>SQl Server</SKILL>
390 string xsltFragment = @"<?xml version=""1.0""?>
391 <xsl:stylesheet version=""1.0"" xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"">
392 <xsl:output omit-xml-declaration=""yes"" />
393 <xsl:preserve-space elements=""*"" />
394 <xsl:template match=""/EMPLOYEES"">
395 <xsl:for-each select=""EMPLOYEE[DEPT='Finance']"">
396 <xsl:sort select=""NAME""/>
397 <xsl:value-of select=""NAME""/>
402 XmlTextReader xmlRdr = new XmlTextReader (new StringReader (xmlFragment));
403 XmlTextReader xsltRdr = new XmlTextReader (new StringReader (xsltFragment));
405 XslTransform stylesheet = new XslTransform ();
406 stylesheet.Load (xsltRdr, new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
408 StringWriter sw = new StringWriter ();
410 stylesheet.Transform (new XPathDocument (xmlRdr), new XsltArgumentList (),
411 sw, new XmlUrlResolver ());
413 Assert.AreEqual (0, sw.ToString ().Length);
416 // http://support.microsoft.com/default.aspx?scid=kb;en-us;834667
418 [Category ("NotDotNet")]
419 public void LocalParameter ()
421 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
422 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
423 <xsl:param name=""param1"" select=""'global-param1-default'"" />
424 <xsl:param name=""param2"" select=""'global-param2-default'"" />
425 <xsl:output method=""text"" encoding=""ascii"" />
426 <xsl:template match=""/"">
427 <xsl:call-template name=""Test"">
428 <xsl:with-param name=""param1"" select=""'local-param1-arg'"" />
429 <xsl:with-param name=""param2"" select=""'local-param2-arg'"" />
432 <xsl:template name=""Test"">
433 <xsl:param name=""param1"" select=""'local-param1-default'"" />
434 <xsl:param name=""param2"" select=""'local-param2-default'"" />
435 <xsl:value-of select=""$param1"" /><xsl:text>/</xsl:text><xsl:value-of select=""$param2"" />
439 XmlDocument xmlDoc = new XmlDocument ();
440 xmlDoc.LoadXml ("<dummy />");
442 XslTransform xsltProcessor = new XslTransform ();
443 xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
444 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
446 StringWriter sw = new StringWriter ();
448 XsltArgumentList xsltArgs = new XsltArgumentList ();
449 xsltArgs.AddParam ("param1", string.Empty, "global-param1-arg");
450 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
452 Assert.AreEqual ("local-param1-arg/local-param2-arg", sw.ToString ());
456 public void Output_Standalone ()
458 StringWriter sw = null;
459 XsltArgumentList xsltArgs = new XsltArgumentList ();
460 XslTransform xsltProcessor = new XslTransform ();
462 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
463 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
465 <xsl:template match=""/"">
470 XmlDocument xmlDoc = new XmlDocument ();
471 xmlDoc.LoadXml ("<dummy />");
473 sw = new StringWriter ();
474 xsltProcessor.Load (new XmlTextReader (new StringReader (
475 string.Format(xsltFragment, "standalone=\"yes\""))),
476 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
477 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
480 "<?xml version=\"1.0\" encoding=\"utf-16\"" +
481 " standalone=\"yes\"?><root />", sw.ToString (), "#1");
483 sw = new StringWriter ();
484 xsltProcessor.Load (new XmlTextReader (new StringReader (
485 string.Format (xsltFragment, "standalone=\"no\""))),
486 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
487 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
490 "<?xml version=\"1.0\" encoding=\"utf-16\"" +
491 " standalone=\"no\"?><root />", sw.ToString (), "#2");
493 sw = new StringWriter ();
494 xsltProcessor.Load (new XmlTextReader (new StringReader (
495 string.Format (xsltFragment, ""))),
496 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
497 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
500 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
501 "<root />", sw.ToString (), "#3");
505 [ExpectedException (typeof (XsltCompileException))]
506 public void Output_Standalone_Invalid ()
508 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
509 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
510 <xsl:output standalone=""Yes"" />
512 XslTransform xsltProcessor = new XslTransform ();
513 xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
514 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
518 public void Output_Standalone_ForwardsCompatible ()
520 StringWriter sw = new StringWriter ();
521 XsltArgumentList xsltArgs = new XsltArgumentList ();
522 XslTransform xsltProcessor = new XslTransform ();
523 XmlDocument xmlDoc = new XmlDocument ();
524 xmlDoc.LoadXml ("<dummy />");
526 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
527 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.5"">
528 <xsl:output standalone=""{0}"" />
529 <xsl:template match=""/"">
534 // standalone is "Yes"
535 xsltProcessor.Load (new XmlTextReader (new StringReader (
536 string.Format (xsltFragment, "Yes"))),
537 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
538 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
541 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
542 "<root />", sw.ToString (), "#1");
544 // standalone is empty
545 sw.GetStringBuilder ().Length = 0;
546 xsltProcessor.Load (new XmlTextReader (new StringReader (
547 string.Format (xsltFragment, ""))),
548 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
549 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
552 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
553 "<root />", sw.ToString (), "#2");
557 [ExpectedException (typeof (XsltCompileException))]
558 public void Output_Standalone_Empty ()
560 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
561 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
562 <xsl:output standalone="""" />
564 XslTransform xsltProcessor = new XslTransform ();
565 xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
566 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
570 public void Output_OmitXmlDeclaration ()
572 StringWriter sw = null;
573 XsltArgumentList xsltArgs = new XsltArgumentList ();
574 XslTransform xsltProcessor = new XslTransform ();
576 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
577 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
579 <xsl:template match=""/"">
584 XmlDocument xmlDoc = new XmlDocument ();
585 xmlDoc.LoadXml ("<dummy />");
587 sw = new StringWriter ();
588 xsltProcessor.Load (new XmlTextReader (new StringReader (
589 string.Format (xsltFragment, "omit-xml-declaration=\"yes\""))),
590 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
591 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
593 Assert.AreEqual ("<root />", sw.ToString (), "#1");
595 sw.GetStringBuilder ().Length = 0;
596 xsltProcessor.Load (new XmlTextReader (new StringReader (
597 string.Format (xsltFragment, "omit-xml-declaration=\"no\""))),
598 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
599 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
602 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
603 "<root />", sw.ToString (), "#2");
607 [ExpectedException (typeof (XsltCompileException))]
608 public void Output_OmitXmlDeclaration_Invalid ()
610 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
611 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
612 <xsl:output omit-xml-declaration=""Yes"" />
614 XslTransform xsltProcessor = new XslTransform ();
615 xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
616 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
620 [ExpectedException (typeof (XsltCompileException))]
621 public void Output_OmitXmlDeclaration_Empty ()
623 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
624 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
625 <xsl:output omit-xml-declaration="""" />
627 XslTransform xsltProcessor = new XslTransform ();
628 xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
629 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
633 public void Output_OmitXmlDeclaration_ForwardsCompatible ()
635 StringWriter sw = new StringWriter ();
636 XsltArgumentList xsltArgs = new XsltArgumentList ();
637 XslTransform xsltProcessor = new XslTransform ();
638 XmlDocument xmlDoc = new XmlDocument ();
639 xmlDoc.LoadXml ("<dummy />");
641 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
642 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.5"">
643 <xsl:output omit-xml-declaration=""{0}"" />
644 <xsl:template match=""/"">
649 // omit-xml-declaration is "Yes"
650 xsltProcessor.Load (new XmlTextReader (new StringReader (
651 string.Format (xsltFragment, "Yes"))),
652 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
653 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
656 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
657 "<root />", sw.ToString (), "#1");
659 // omit-xml-declaration is empty
660 sw.GetStringBuilder ().Length = 0;
661 xsltProcessor.Load (new XmlTextReader (new StringReader (
662 string.Format (xsltFragment, ""))),
663 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
664 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
667 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
668 "<root />", sw.ToString (), "#2");
672 public void Output_DocType_Xml ()
674 XsltArgumentList xsltArgs = new XsltArgumentList ();
675 XslTransform xsltProcessor = new XslTransform ();
677 // set both doctype-system and doctype-public
678 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
679 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
681 doctype-public=""-//W3C//DTD XHTML 1.0 Strict//EN""
682 doctype-system=""http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"" />
683 <xsl:template match=""/"">
684 <xsl:element name=""test"">
685 <xsl:element name=""abc"" />
690 XmlDocument xmlDoc = new XmlDocument ();
691 xmlDoc.LoadXml ("<dummy />");
693 StringWriter sw = new StringWriter ();
694 xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
695 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
696 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
699 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
700 "<!DOCTYPE test PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">" +
701 "<test><abc /></test>", sw.ToString (), "#1");
703 // only set doctype-public
704 xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
705 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
707 doctype-public=""-//W3C//DTD XHTML 1.0 Strict//EN"" />
708 <xsl:template match=""/"">
709 <xsl:element name=""test"">
710 <xsl:element name=""abc"" />
715 sw.GetStringBuilder ().Length = 0;
716 xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
717 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
718 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
721 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
722 "<test><abc /></test>", sw.ToString (), "#2");
724 // only set doctype-system
725 xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
726 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
729 doctype-system=""http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"" />
730 <xsl:template match=""/"">
731 <xsl:element name=""test"">
732 <xsl:element name=""abc"" />
737 sw.GetStringBuilder ().Length = 0;
738 xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
739 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
740 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
743 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
744 "<!DOCTYPE test SYSTEM \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">" +
745 "<test><abc /></test>", sw.ToString (), "#3");
747 // set empty doctype-public and empty doctype-system
748 xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
749 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
752 doctype-system="""" />
753 <xsl:template match=""/"">
754 <xsl:element name=""test"">
755 <xsl:element name=""abc"" />
760 sw.GetStringBuilder ().Length = 0;
761 xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
762 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
763 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
766 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
767 "<!DOCTYPE test PUBLIC \"\" \"\">" +
768 "<test><abc /></test>", sw.ToString (), "#4");
770 // set empty doctype-public
771 xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
772 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
775 doctype-public="""" />
776 <xsl:template match=""/"">
777 <xsl:element name=""test"">
778 <xsl:element name=""abc"" />
783 sw.GetStringBuilder ().Length = 0;
784 xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
785 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
786 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
789 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
790 "<test><abc /></test>", sw.ToString (), "#5");
792 // set empty doctype-system
793 xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
794 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
796 doctype-system="""" />
797 <xsl:template match=""/"">
798 <xsl:element name=""test"">
799 <xsl:element name=""abc"" />
804 sw.GetStringBuilder ().Length = 0;
805 xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
806 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
807 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
810 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
811 "<!DOCTYPE test SYSTEM \"\">" +
812 "<test><abc /></test>", sw.ToString (), "#6");
816 public void Output_DocType_Html ()
818 XsltArgumentList xsltArgs = new XsltArgumentList ();
819 XslTransform xsltProcessor = new XslTransform ();
821 // set both doctype-system and doctype-public
822 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
823 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
827 doctype-public=""-//W3C//DTD XHTML 1.0 Strict//EN""
828 doctype-system=""http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"" />
829 <xsl:template match=""/"">
830 <xsl:element name=""test"">
831 <xsl:element name=""abc"" />
836 XmlDocument xmlDoc = new XmlDocument ();
837 xmlDoc.LoadXml ("<dummy />");
839 StringWriter sw = new StringWriter ();
840 xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
841 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
842 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
845 "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">" +
846 "<test><abc></abc></test>", sw.ToString (), "#1");
848 // only set doctype-public
849 xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
850 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
854 doctype-public=""-//W3C//DTD XHTML 1.0 Strict//EN"" />
855 <xsl:template match=""/"">
856 <xsl:element name=""test"">
857 <xsl:element name=""abc"" />
862 sw.GetStringBuilder ().Length = 0;
863 xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
864 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
865 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
868 "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" >" +
869 "<test><abc></abc></test>", sw.ToString (), "#2");
871 // only set doctype-system
872 xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
873 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
877 doctype-system=""http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"" />
878 <xsl:template match=""/"">
879 <xsl:element name=""test"">
880 <xsl:element name=""abc"" />
885 sw.GetStringBuilder ().Length = 0;
886 xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
887 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
888 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
891 "<!DOCTYPE html SYSTEM \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">" +
892 "<test><abc></abc></test>", sw.ToString (), "#3");
894 // set empty doctype-public and empty doctype-system
895 xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
896 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
900 doctype-public="""" doctype-system="""" />
901 <xsl:template match=""/"">
902 <xsl:element name=""test"">
903 <xsl:element name=""abc"" />
908 sw.GetStringBuilder ().Length = 0;
909 xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
910 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
911 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
914 "<!DOCTYPE html PUBLIC \"\" \"\">" +
915 "<test><abc></abc></test>", sw.ToString (), "#4");
917 // set empty doctype-public
918 xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
919 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
923 doctype-public="""" />
924 <xsl:template match=""/"">
925 <xsl:element name=""test"">
926 <xsl:element name=""abc"" />
931 sw.GetStringBuilder ().Length = 0;
932 xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
933 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
934 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
937 "<!DOCTYPE html PUBLIC \"\" >" +
938 "<test><abc></abc></test>", sw.ToString (), "#5");
940 // set empty doctype-system
941 xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
942 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
946 doctype-system="""" />
947 <xsl:template match=""/"">
948 <xsl:element name=""test"">
949 <xsl:element name=""abc"" />
954 sw.GetStringBuilder ().Length = 0;
955 xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
956 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
957 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
960 "<!DOCTYPE html SYSTEM \"\">" +
961 "<test><abc></abc></test>", sw.ToString (), "#6");
965 public void Output_Indent_Xml_DocType ()
967 XsltArgumentList xsltArgs = new XsltArgumentList ();
968 XslTransform xsltProcessor = new XslTransform ();
970 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
971 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
973 doctype-public=""-//W3C//DTD XHTML 1.0 Strict//EN""
974 doctype-system=""http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd""
976 <xsl:template match=""/"">
977 <xsl:element name=""test"">
978 <xsl:element name=""something"">
979 <xsl:element name=""else"" />
985 XmlDocument xmlDoc = new XmlDocument ();
986 xmlDoc.LoadXml ("<dummy />");
989 StringWriter sw = new StringWriter ();
990 xsltProcessor.Load (new XmlTextReader (new StringReader (
991 string.Format (xsltFragment, "indent=\"yes\""))),
992 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
993 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
995 Assert.AreEqual (string.Format(CultureInfo.InvariantCulture,
996 "<?xml version=\"1.0\" encoding=\"utf-16\"?>{0}" +
997 "<!DOCTYPE test PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">{0}" +
1001 " </something>{0}" +
1002 "</test>", Environment.NewLine), sw.ToString (), "#1");
1005 sw.GetStringBuilder ().Length = 0;
1006 xsltProcessor.Load (new XmlTextReader (new StringReader (
1007 string.Format (xsltFragment, "indent=\"no\""))),
1008 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1009 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
1012 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
1013 "<!DOCTYPE test PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">" +
1014 "<test><something><else /></something></test>", sw.ToString (),
1018 sw.GetStringBuilder ().Length = 0;
1019 xsltProcessor.Load (new XmlTextReader (new StringReader (
1020 string.Format (xsltFragment, ""))),
1021 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1022 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
1025 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
1026 "<!DOCTYPE test PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">" +
1027 "<test><something><else /></something></test>", sw.ToString (),
1032 [Category ("NotWorking")] // bug #77081: mono does not output newline and indentation for non-html elements
1033 public void Output_Indent_Html_DocType ()
1035 XsltArgumentList xsltArgs = new XsltArgumentList ();
1036 XslTransform xsltProcessor = new XslTransform ();
1038 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
1039 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
1042 doctype-public=""-//W3C//DTD XHTML 1.0 Strict//EN""
1043 doctype-system=""http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd""
1045 <xsl:template match=""/"">
1046 <xsl:element name=""test"">
1047 <xsl:element name=""something"">
1048 <xsl:element name=""else"" />
1054 XmlDocument xmlDoc = new XmlDocument ();
1055 xmlDoc.LoadXml ("<dummy />");
1057 // set indent to yes
1058 StringWriter sw = new StringWriter ();
1059 xsltProcessor.Load (new XmlTextReader (new StringReader (
1060 string.Format (xsltFragment, "indent=\"yes\""))),
1061 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1062 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
1064 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
1065 "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">{0}" +
1070 " </something>{0}" +
1071 "</test>", Environment.NewLine), sw.ToString (), "#1");
1074 sw.GetStringBuilder ().Length = 0;
1075 xsltProcessor.Load (new XmlTextReader (new StringReader (
1076 string.Format (xsltFragment, "indent=\"no\""))),
1077 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1078 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
1080 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
1081 "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">" +
1082 "<test><something><else></else></something></test>",
1083 Environment.NewLine), sw.ToString (), "#2");
1086 sw.GetStringBuilder ().Length = 0;
1087 xsltProcessor.Load (new XmlTextReader (new StringReader (
1088 string.Format (xsltFragment, ""))),
1089 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1090 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
1092 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
1093 "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">{0}" +
1098 " </something>{0}" +
1099 "</test>", Environment.NewLine), sw.ToString (), "#3");
1103 public void Output_Indent_Xml ()
1105 XsltArgumentList xsltArgs = new XsltArgumentList ();
1106 XslTransform xsltProcessor = new XslTransform ();
1108 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
1109 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
1112 <xsl:template match=""/"">
1113 <xsl:element name=""test"">
1114 <xsl:element name=""something"">
1115 <xsl:element name=""else"" />
1121 XmlDocument xmlDoc = new XmlDocument ();
1122 xmlDoc.LoadXml ("<dummy />");
1124 // set indent to yes
1125 StringWriter sw = new StringWriter ();
1126 xsltProcessor.Load (new XmlTextReader (new StringReader (
1127 string.Format (xsltFragment, "indent=\"yes\""))),
1128 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1129 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
1131 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
1132 "<?xml version=\"1.0\" encoding=\"utf-16\"?>{0}" +
1136 " </something>{0}" +
1137 "</test>", Environment.NewLine), sw.ToString (), "#1");
1140 sw.GetStringBuilder ().Length = 0;
1141 xsltProcessor.Load (new XmlTextReader (new StringReader (
1142 string.Format (xsltFragment, "indent=\"no\""))),
1143 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1144 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
1147 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
1148 "<test><something><else /></something></test>", sw.ToString (),
1152 sw.GetStringBuilder ().Length = 0;
1153 xsltProcessor.Load (new XmlTextReader (new StringReader (
1154 string.Format (xsltFragment, ""))),
1155 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1156 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
1159 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
1160 "<test><something><else /></something></test>", sw.ToString (),
1165 [Category ("NotWorking")] // bug #77081: mono does not output newline and indentation for non-html elements
1166 public void Output_Indent_Html ()
1168 XsltArgumentList xsltArgs = new XsltArgumentList ();
1169 XslTransform xsltProcessor = new XslTransform ();
1171 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
1172 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
1176 <xsl:template match=""/"">
1177 <xsl:element name=""html"">
1178 <xsl:element name=""body"">
1179 <xsl:element name=""p"" />
1180 <xsl:element name=""p"">
1181 <xsl:text>something</xsl:text>
1183 <xsl:element name=""p"">
1184 <xsl:element name=""div"" />
1186 <xsl:element name=""p"">
1187 <xsl:element name=""whatever"" />
1194 XmlDocument xmlDoc = new XmlDocument ();
1195 xmlDoc.LoadXml ("<dummy />");
1197 // set indent to yes
1198 StringWriter sw = new StringWriter ();
1199 xsltProcessor.Load (new XmlTextReader (new StringReader (
1200 string.Format (xsltFragment, "indent=\"yes\""))),
1201 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1202 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
1204 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
1209 " <p>something</p>{0}" +
1219 "</html>", Environment.NewLine), sw.ToString (), "#1");
1222 sw.GetStringBuilder ().Length = 0;
1223 xsltProcessor.Load (new XmlTextReader (new StringReader (
1224 string.Format (xsltFragment, "indent=\"no\""))),
1225 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1226 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
1228 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
1229 "<html><body><p></p><p>something</p><p><div></div></p>" +
1230 "<p><whatever></whatever></p></body></html>",
1231 Environment.NewLine), sw.ToString (), "#2");
1234 sw.GetStringBuilder ().Length = 0;
1235 xsltProcessor.Load (new XmlTextReader (new StringReader (
1236 string.Format (xsltFragment, ""))),
1237 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1238 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
1240 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
1245 " <p>something</p>{0}" +
1255 "</html>", Environment.NewLine), sw.ToString (), "#3");
1259 [ExpectedException (typeof (XsltCompileException))]
1260 public void Output_Indent_Invalid ()
1262 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
1263 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
1264 <xsl:output indent=""Yes"" />
1266 XslTransform xsltProcessor = new XslTransform ();
1267 xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
1268 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1272 [ExpectedException (typeof (XsltCompileException))]
1273 public void Output_Indent_Empty ()
1275 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
1276 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
1277 <xsl:output indent="""" />
1279 XslTransform xsltProcessor = new XslTransform ();
1280 xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
1281 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1285 public void Output_Indent_ForwardsCompatible ()
1287 StringWriter sw = new StringWriter ();
1288 XsltArgumentList xsltArgs = new XsltArgumentList ();
1289 XslTransform xsltProcessor = new XslTransform ();
1290 XmlDocument xmlDoc = new XmlDocument ();
1291 xmlDoc.LoadXml ("<dummy />");
1293 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
1294 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.5"">
1295 <xsl:output indent=""{0}"" />
1296 <xsl:template match=""/"">
1302 xsltProcessor.Load (new XmlTextReader (new StringReader (
1303 string.Format (xsltFragment, "Yes"))),
1304 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1305 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
1308 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
1309 "<root />", sw.ToString (), "#1");
1312 sw.GetStringBuilder ().Length = 0;
1313 xsltProcessor.Load (new XmlTextReader (new StringReader (
1314 string.Format (xsltFragment, ""))),
1315 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1316 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
1319 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
1320 "<root />", sw.ToString (), "#2");
1324 public void Output_MediaType ()
1326 StringWriter sw = null;
1327 XsltArgumentList xsltArgs = new XsltArgumentList ();
1328 XslTransform xsltProcessor = new XslTransform ();
1330 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
1331 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
1332 <xsl:output media-type=""whatever"" />
1333 <xsl:template match=""/"">
1338 XmlDocument xmlDoc = new XmlDocument ();
1339 xmlDoc.LoadXml ("<dummy />");
1341 sw = new StringWriter ();
1342 xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
1343 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1344 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
1347 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
1348 "<root />", sw.ToString ());
1352 public void Output_Encoding_TextWriter ()
1354 StringWriter sw = null;
1355 XsltArgumentList xsltArgs = new XsltArgumentList ();
1356 XslTransform xsltProcessor = new XslTransform ();
1358 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
1359 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
1361 <xsl:template match=""/"">
1366 XmlDocument xmlDoc = new XmlDocument ();
1367 xmlDoc.LoadXml ("<dummy />");
1370 sw = new StringWriter ();
1371 xsltProcessor.Load (new XmlTextReader (new StringReader (
1372 string.Format (xsltFragment, string.Empty))),
1373 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1374 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
1377 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
1378 "<root />", sw.ToString (), "#1");
1381 sw.GetStringBuilder ().Length = 0;
1382 xsltProcessor.Load (new XmlTextReader (new StringReader (
1383 string.Format(xsltFragment, "encoding=\"iso-8859-1\""))),
1384 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1385 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
1388 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
1389 "<root />", sw.ToString (), "#1");
1392 sw.GetStringBuilder ().Length = 0;
1393 xsltProcessor.Load (new XmlTextReader (new StringReader (
1394 string.Format (xsltFragment, "encoding=\"doesnotexist\""))),
1395 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1396 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
1399 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
1400 "<root />", sw.ToString (), "#2");
1403 sw.GetStringBuilder ().Length = 0;
1404 xsltProcessor.Load (new XmlTextReader (new StringReader (
1405 string.Format (xsltFragment, "encoding=\"\""))),
1406 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1407 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
1410 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
1411 "<root />", sw.ToString (), "#3");
1415 public void Output_Encoding_Stream ()
1417 MemoryStream ms = null;
1418 string result = null;
1419 XsltArgumentList xsltArgs = new XsltArgumentList ();
1420 XslTransform xsltProcessor = new XslTransform ();
1422 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
1423 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
1425 <xsl:template match=""/"">
1430 XmlDocument xmlDoc = new XmlDocument ();
1431 xmlDoc.LoadXml ("<dummy />");
1434 ms = new MemoryStream ();
1435 xsltProcessor.Load (new XmlTextReader (new StringReader (
1436 string.Format (xsltFragment, string.Empty))),
1437 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1438 xsltProcessor.Transform (xmlDoc, xsltArgs, ms, new XmlUrlResolver ());
1440 using (StreamReader sr = new StreamReader (ms, true)) {
1441 result = sr.ReadToEnd ();
1445 "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
1446 "<root />", result, "#1");
1449 ms = new MemoryStream ();
1450 xsltProcessor.Load (new XmlTextReader (new StringReader (
1451 string.Format (xsltFragment, "encoding=\"iso-8859-1\""))),
1452 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1453 xsltProcessor.Transform (xmlDoc, xsltArgs, ms, new XmlUrlResolver ());
1455 using (StreamReader sr = new StreamReader (ms, true)) {
1456 result = sr.ReadToEnd ();
1460 "<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>" +
1461 "<root />", result, "#2");
1464 ms = new MemoryStream ();
1465 xsltProcessor.Load (new XmlTextReader (new StringReader (
1466 string.Format (xsltFragment, "encoding=\"doesnotexist\""))),
1467 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1468 xsltProcessor.Transform (xmlDoc, xsltArgs, ms, new XmlUrlResolver ());
1470 using (StreamReader sr = new StreamReader (ms, true)) {
1471 result = sr.ReadToEnd ();
1475 "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
1476 "<root />", result, "#3");
1479 ms = new MemoryStream ();
1480 xsltProcessor.Load (new XmlTextReader (new StringReader (
1481 string.Format (xsltFragment, "encoding=\"\""))),
1482 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1483 xsltProcessor.Transform (xmlDoc, xsltArgs, ms, new XmlUrlResolver ());
1485 using (StreamReader sr = new StreamReader (ms, true)) {
1486 result = sr.ReadToEnd ();
1490 "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
1491 "<root />", result, "#4");
1495 public void Output_Version ()
1497 StringWriter sw = null;
1498 XsltArgumentList xsltArgs = new XsltArgumentList ();
1499 XslTransform xsltProcessor = new XslTransform ();
1501 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
1502 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
1503 <xsl:output version=""{0}"" />
1504 <xsl:template match=""/"">
1509 XmlDocument xmlDoc = new XmlDocument ();
1510 xmlDoc.LoadXml ("<dummy />");
1513 sw = new StringWriter ();
1514 xsltProcessor.Load (new XmlTextReader (new StringReader (
1515 string.Format (xsltFragment, "1.0"))),
1516 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1517 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
1520 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
1521 "<root />", sw.ToString (), "#1");
1524 sw.GetStringBuilder ().Length = 0;
1525 xsltProcessor.Load (new XmlTextReader (new StringReader (
1526 string.Format (xsltFragment, "2.0"))),
1527 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1528 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
1531 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
1532 "<root />", sw.ToString (), "#2");
1535 sw.GetStringBuilder ().Length = 0;
1536 xsltProcessor.Load (new XmlTextReader (new StringReader (
1537 string.Format (xsltFragment, "BLABLA"))),
1538 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1539 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
1542 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
1543 "<root />", sw.ToString (), "#3");
1547 public void Output_Method_Html_TextWriter ()
1549 string options = null;
1550 StringWriter sw = null;
1551 XsltArgumentList xsltArgs = new XsltArgumentList ();
1552 XslTransform xsltProcessor = new XslTransform ();
1554 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
1555 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
1556 <xsl:output method=""html"" {0} />
1557 <xsl:template match=""/"">
1558 <xsl:element name=""html"">
1559 <xsl:element name=""head"">
1560 <xsl:element name=""title"">Output Test</xsl:element>
1562 <xsl:element name=""Body"">
1563 <xsl:element name=""BR"" />
1569 XmlDocument xmlDoc = new XmlDocument ();
1570 xmlDoc.LoadXml ("<dummy />");
1572 // indent not set, media-type not set
1573 sw = new StringWriter ();
1574 xsltProcessor.Load (new XmlTextReader (new StringReader (
1575 string.Format (xsltFragment, string.Empty))),
1576 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1577 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
1579 Assert.AreEqual (string.Format(CultureInfo.InvariantCulture,
1582 "{1}{1}<META http-equiv=\"Content-Type\" content=\"text/html; charset=utf-16\">{0}" +
1583 "{1}{1}<title>Output Test</title>{0}" +
1588 "</html>", Environment.NewLine, " "), sw.ToString (), "#1");
1590 // indent no, media-type not set
1591 options = "indent=\"no\"";
1592 sw.GetStringBuilder ().Length = 0;
1593 xsltProcessor.Load (new XmlTextReader (new StringReader (
1594 string.Format (xsltFragment, options))),
1595 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1596 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
1598 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
1601 "{1}{1}<META http-equiv=\"Content-Type\" content=\"text/html; charset=utf-16\">{0}" +
1602 "{1}{1}<title>Output Test</title>{0}" +
1607 "</html>", string.Empty, string.Empty), sw.ToString (), "#2");
1609 // indent yes, media-type "bla", omit-xml-declaration "no"
1610 options = "indent=\"yes\" media-type=\"bla\"" +
1611 " encoding=\"iso-8859-1\" omit-xml-declaration=\"no\"";
1612 sw.GetStringBuilder ().Length = 0;
1613 xsltProcessor.Load (new XmlTextReader (new StringReader (
1614 string.Format (xsltFragment, options))),
1615 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1616 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
1618 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
1621 "{1}{1}<META http-equiv=\"Content-Type\" content=\"bla; charset=utf-16\">{0}" +
1622 "{1}{1}<title>Output Test</title>{0}" +
1627 "</html>", Environment.NewLine, " "), sw.ToString (), "#3");
1631 public void Output_Method_Html_Stream ()
1633 string options = null;
1634 MemoryStream ms = null;
1635 string result = null;
1636 XsltArgumentList xsltArgs = new XsltArgumentList ();
1637 XslTransform xsltProcessor = new XslTransform ();
1639 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
1640 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
1641 <xsl:output method=""html"" {0} />
1642 <xsl:template match=""/"">
1643 <xsl:element name=""html"">
1644 <xsl:element name=""head"">
1645 <xsl:element name=""title"">Output Test</xsl:element>
1647 <xsl:element name=""Body"">
1648 <xsl:element name=""BR"" />
1654 XmlDocument xmlDoc = new XmlDocument ();
1655 xmlDoc.LoadXml ("<dummy />");
1657 // indent not set, media-type not set
1658 ms = new MemoryStream ();
1659 xsltProcessor.Load (new XmlTextReader (new StringReader (
1660 string.Format (xsltFragment, string.Empty))),
1661 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1662 xsltProcessor.Transform (xmlDoc, xsltArgs, ms, new XmlUrlResolver ());
1664 using (StreamReader sr = new StreamReader (ms, true)) {
1665 result = sr.ReadToEnd ();
1668 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
1671 "{1}{1}<META http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">{0}" +
1672 "{1}{1}<title>Output Test</title>{0}" +
1677 "</html>", Environment.NewLine, " "), result, "#1");
1679 // indent no, media-type not set
1680 options = "indent=\"no\"";
1681 ms = new MemoryStream ();
1682 xsltProcessor.Load (new XmlTextReader (new StringReader (
1683 string.Format (xsltFragment, options))),
1684 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1685 xsltProcessor.Transform (xmlDoc, xsltArgs, ms, new XmlUrlResolver ());
1687 using (StreamReader sr = new StreamReader (ms, true)) {
1688 result = sr.ReadToEnd ();
1691 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
1694 "{1}{1}<META http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">{0}" +
1695 "{1}{1}<title>Output Test</title>{0}" +
1700 "</html>", string.Empty, string.Empty), result, "#2");
1702 // indent yes, media-type "bla", omit-xml-declaration "no"
1703 options = "indent=\"yes\" media-type=\"bla\"" +
1704 " encoding=\"iso-8859-1\" omit-xml-declaration=\"no\"";
1705 ms = new MemoryStream ();
1706 xsltProcessor.Load (new XmlTextReader (new StringReader (
1707 string.Format (xsltFragment, options))),
1708 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1709 xsltProcessor.Transform (xmlDoc, xsltArgs, ms, new XmlUrlResolver ());
1711 using (StreamReader sr = new StreamReader (ms, true)) {
1712 result = sr.ReadToEnd ();
1715 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
1718 "{1}{1}<META http-equiv=\"Content-Type\" content=\"bla; charset=iso-8859-1\">{0}" +
1719 "{1}{1}<title>Output Test</title>{0}" +
1724 "</html>", Environment.NewLine, " "), result, "#3");
1728 [ExpectedException (typeof (XsltCompileException))]
1729 public void Output_Unknown_Attribute ()
1731 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
1732 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
1733 <xsl:output whatever="""" />
1735 XslTransform xsltProcessor = new XslTransform ();
1736 xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
1737 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1741 public void Output_Unknown_Attribute_ForwardsCompatible ()
1743 StringWriter sw = new StringWriter ();
1744 XsltArgumentList xsltArgs = new XsltArgumentList ();
1745 XslTransform xsltProcessor = new XslTransform ();
1746 XmlDocument xmlDoc = new XmlDocument ();
1747 xmlDoc.LoadXml ("<dummy />");
1749 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
1750 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.5"">
1751 <xsl:output whatever="""" />
1752 <xsl:template match=""/"">
1757 xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
1758 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1759 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
1762 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
1763 "<root />", sw.ToString (), "#1");
1767 public void Output_Unknown_Attribute_NonDefaultNamespace ()
1769 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
1770 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" xmlns:tst=""something"" version=""1.0"">
1771 <xsl:output tst:whatever="""" />
1773 XslTransform xsltProcessor = new XslTransform ();
1774 xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
1775 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1778 // http://support.microsoft.com/kb/832757/en-us
1780 public void FormatNumber_KB_832757 ()
1782 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8""?>
1783 <xsl:stylesheet version=""1.0"" xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"">
1784 <xsl:output method=""xml"" version=""1.0"" encoding=""UTF-8"" indent=""yes"" />
1785 <xsl:template match=""/"">
1787 <xsl:apply-templates />
1790 <xsl:template match=""number"">
1791 <tr><td><xsl:value-of select=""format-number(.,'#,##0;(#,##0)')""/></td></tr>
1795 XmlDocument xmlDoc = new XmlDocument ();
1796 xmlDoc.LoadXml ("<root><number>1000</number></root>");
1798 StringWriter sw = new StringWriter ();
1799 XslTransform xsltProcessor = new XslTransform ();
1800 xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
1801 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1802 xsltProcessor.Transform (xmlDoc, new XsltArgumentList (), sw,
1803 new XmlUrlResolver ());
1805 Assert.AreEqual (string.Format(CultureInfo.InvariantCulture,
1806 "<?xml version=\"1.0\" encoding=\"utf-16\"?>{0}" +
1809 " <td>1,000</td>{0}" +
1811 "</table>", Environment.NewLine), sw.ToString ());
1814 // http://support.microsoft.com/kb/293469/en-us
1816 public void FormatNumber_KB_293469 ()
1818 string xsltFragment = @"<?xml version=""1.0""?>
1819 <xsl:stylesheet version=""1.0"" xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"">
1820 <xsl:output method=""xml"" indent=""yes"" />
1821 <xsl:decimal-format name=""european"" decimal-separator="","" grouping-separator=""."" />
1822 <xsl:template match=""/"">
1823 <xsl:element name=""html"">
1824 <xsl:element name=""body"">
1825 <xsl:apply-templates select=""root/amount"" />
1829 <xsl:template match=""amount"">
1830 <xsl:value-of select=""format-number(., '###.###,00', 'european')""/>
1834 XmlDocument xmlDoc = new XmlDocument ();
1835 xmlDoc.LoadXml ("<root><amount currency='USD'>44442.7</amount></root>");
1837 StringWriter sw = new StringWriter ();
1838 XslTransform xsltProcessor = new XslTransform ();
1839 xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
1840 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1841 xsltProcessor.Transform (xmlDoc, new XsltArgumentList (), sw,
1842 new XmlUrlResolver ());
1844 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
1845 "<?xml version=\"1.0\" encoding=\"utf-16\"?>{0}" +
1847 " <body>44.442,70</body>{0}" +
1848 "</html>", Environment.NewLine), sw.ToString ());
1852 [Category ("NotDotNet")]
1853 // MS bug: the output must be well-formed XML general entity
1854 // (doctype must not appear after text nodes).
1855 public void DocTypeAfterText ()
1858 <xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
1859 <xsl:output doctype-system='system'/>
1860 <xsl:template match='/'>
1861 <xsl:text xml:space='preserve'> a </xsl:text>
1865 XslTransform t = new XslTransform ();
1866 t.Load (new XmlTextReader (xsl, XmlNodeType.Document, null));
1867 XmlDocument doc = new XmlDocument ();
1869 t.Transform (new XPathDocument (
1870 new StringReader ("<root/>")),
1871 null, TextWriter.Null);
1872 Assert.Fail ("should fail; doctype is not allowed after whitespace. See XSLT 1.0 section 16.1.");
1878 public void StripSpace ()
1892 XslTransform t = new XslTransform ();
1893 t.Load ("Test/XmlFiles/xsl/stripspace.xsl");
1894 XPathDocument d = new XPathDocument (
1895 "Test/XmlFiles/xsl/stripspace.xml", XmlSpace.Preserve);
1896 StringWriter sw = new StringWriter ();
1897 t.Transform (d, null, sw);
1898 Assert.AreEqual (result, sw.ToString ());
1902 public void CurrentInSelect ()
1904 XslTransform t = new XslTransform ();
1905 t.Load ("Test/XmlFiles/xsl/current-in-select.xsl");
1906 XPathDocument d = new XPathDocument (
1907 "Test/XmlFiles/xsl/current-in-select.xml", XmlSpace.Preserve);
1908 StringWriter sw = new StringWriter ();
1909 t.Transform (d, null, sw);
1910 using (StreamReader sr = File.OpenText (
1911 "Test/XmlFiles/xsl/current-in-select.ref")) {
1912 string s = sr.ReadToEnd ();
1913 Assert.AreEqual (s, sw.ToString ());
1918 public void CallTemplateSignificantWhitespace ()
1921 string xsl = @"<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
1922 <xsl:template name='foo' xml:space='preserve'>
1923 <xsl:call-template name='bar'>
1924 <xsl:with-param name='hoge' select='hoge' />
1925 </xsl:call-template>
1928 <xsl:template name='bar'>
1931 XslTransform t = new XslTransform ();
1932 t.Load (new XmlTextReader (new StringReader (xsl)));
1933 t.Transform (new XPathDocument (new StringReader ("<dummy/>")), null, new XmlTextWriter (TextWriter.Null));
1937 public void Bug82493 ()
1939 XslTransform transformationObj = new XslTransform ();
1940 transformationObj.Load ("Test/XmlFiles/xsl/82493.xsl");
1941 XmlDocument doc = new XmlDocument ();
1942 doc.Load ("Test/XmlFiles/xsl/82493.xml");
1943 XslExtensionClass GetCalculation = new XslExtensionClass ("a4");
1944 XsltArgumentList xslExtensionArgList = new XsltArgumentList ();
1945 xslExtensionArgList.AddExtensionObject ("urn:e", GetCalculation);
1946 XmlTextWriter writer = new XmlTextWriter (TextWriter.Null);
1947 transformationObj.Transform (doc, xslExtensionArgList, writer, null);
1952 public void BugNovell325482 ()
1954 XmlDocument doc = new XmlDocument ();
1955 doc.Load ("Test/XmlFiles/xsl/325482.xml");
1956 XslTransform xt = new XslTransform ();
1957 xt.Load ("Test/XmlFiles/xsl/325482.xsl");
1958 xt.Transform (doc, null, TextWriter.Null);
1961 public class XslExtensionClass
1963 private string paperType = String.Empty;
1965 public XslExtensionClass (string paperType)
1967 this.paperType = paperType;
1970 public int GetPageDimensions ()
1972 switch (this.paperType) {
1978 throw new ArgumentException ("Unknown page size type: " + this.paperType);
1983 [Test] // bug #348786
1984 public void ValueOfContainsExternalElements ()
1987 <xsl:stylesheet version=""1.0"" xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"">
1988 <xsl:template match=""x"">
1990 <xsl:value-of select=""@bar"">
1991 <!-- enter comment here -->
1996 new XslTransform ().Load (new XmlTextReader (xsl, XmlNodeType.Document, null));
1999 [Test] // bug #349035
2000 public void CompareRTFAsStringNotNodeset ()
2002 XslTransform xslt = new XslTransform ();
2003 xslt.Load (new XmlTextReader (new StringReader (@"
2004 <xsl:stylesheet version=""1.0""
2005 xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"">
2006 <xsl:template name=""foo"">
2007 <xsl:param name=""bar""/>
2008 <xsl:if test=""$bar!=''"">
2009 <bar>bar is not empty:'<xsl:value-of select=""$bar""/>'</bar>
2011 <xsl:if test=""$bar=''"">
2012 <bar>bar is empty</bar>
2015 <xsl:template match=""zap"">
2016 <xsl:call-template name=""foo"">
2017 <xsl:with-param name=""bar"">
2018 <xsl:for-each select=""@bar"">
2019 <xsl:value-of select="".""/>
2022 </xsl:call-template>
2026 XPathDocument input = new XPathDocument (new StringReader (
2032 StringWriter sw = new StringWriter ();
2033 XmlTextWriter xtw = new XmlTextWriter (sw);
2034 xslt.Transform (input, null, xtw);
2035 string expected = "<bar>bar is not empty:'HaHa'</bar><bar>bar is empty</bar>";
2036 Assert.AreEqual (expected, sw.ToString ());
2040 public void Bug349111 ()
2042 XslTransform xslt = new XslTransform ();
2043 xslt.Load (new XmlTextReader (new StringReader (@"
2044 <xsl:stylesheet version=""1.0"" xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"">
2045 <xsl:template match=""book"">
2046 <xsl:for-each select=""child::node()[position()]"">
2048 <xsl:value-of select="".""/>
2054 XPathDocument input = new XPathDocument (new StringReader (@"
2056 <book> <title lang=""eng"">Harry Potter</title> <price>29.99</price> </book>
2059 StringWriter sw = new StringWriter ();
2060 xslt.Transform (input, null, new XmlTextWriter (sw));
2061 string expected = "<yyy>Harry Potter</yyy><yyy>29.99</yyy>";
2062 Assert.AreEqual (expected, sw.ToString ());
2066 public void Bug351939 ()
2068 XslTransform xslt = new XslTransform ();
2069 xslt.Load (new XmlTextReader (new StringReader (
2070 @"<xsl:stylesheet version=""1.0""
2071 xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"">
2072 <xsl:key name=""thekey"" match=""aa"" use=""''""/>
2073 <xsl:key name=""thekey"" match=""ab"" use=""''""/>
2074 <xsl:template match=""root"">
2076 <foo><xsl:value-of select=""key('thekey','')[1]""/></foo>
2077 <bar><xsl:value-of select=""key('thekey','')[2]""/></bar>
2078 <baz><xsl:value-of select=""key('thekey','')[3]""/></baz>
2079 <tem><xsl:value-of select=""key('thekey','')[4]""/></tem>
2082 </xsl:stylesheet>")));
2083 StringWriter sw = new StringWriter ();
2084 xslt.Transform (new XPathDocument (new StringReader (
2085 @"<?xml version=""1.0""?>
2095 </root>")), null, new XmlTextWriter (sw));
2096 Assert.AreEqual ("<x><foo>1</foo><bar>2</bar><baz>3</baz><tem>4</tem></x>", sw.ToString ());
2100 public void CopyOfIXPathNavigable ()
2103 <xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'
2104 xmlns:foo='urn:Foo'>
2105 <xsl:template match='/'>
2106 <xsl:copy-of select='foo:MyCustomFunction()'/>
2112 <given-name age='10'>
2114 <nick-name>Freddy</nick-name>
2116 <family-name>Smith</family-name>
2119 <given-name age='10'>
2121 <nick-name>Bob</nick-name>
2123 <family-name>Smith</family-name>
2126 XslTransform t = new XslTransform ();
2127 t.Load (new XPathDocument (new StringReader (xsl)));
2128 XsltArgumentList args = new XsltArgumentList();
2129 args.AddExtensionObject ("urn:Foo", new CopyOfIXPathNavigableClass ());
2130 StringWriter sw = new StringWriter ();
2131 t.Transform (new XPathDocument (new StringReader (xml)), args, new XmlTextWriter (sw));
2132 Assert.AreEqual ("<root><child0 /><child1 /></root>", sw.ToString ());
2135 public class CopyOfIXPathNavigableClass
2137 public object MyCustomFunction ()
2139 XmlDocument doc = new XmlDocument ();
2140 doc .LoadXml ("<root><child0 /><child1 /></root>");
2141 return doc.DocumentElement;
2145 [Test] // bug #316238
2146 public void ResolveVariableInXsltArgumentList ()
2148 ResolveVariableInXsltArgumentList ("Test/XmlFiles/xsl/316238-1.xsl");
2149 ResolveVariableInXsltArgumentList ("Test/XmlFiles/xsl/316238-2.xsl");
2152 void ResolveVariableInXsltArgumentList (string file)
2154 XmlDocument doc = new XmlDocument ();
2155 doc.LoadXml ("<doc><element id=\"test\">this is a test</element></doc>");
2156 XslTransform transform = new XslTransform ();
2157 transform.Load (file);
2158 //Stream outputStream = Console.OpenStandardOutput();
2159 XsltArgumentList xsltArgs = new XsltArgumentList ();
2160 xsltArgs.AddParam ("test", "", "test");
2161 xsltArgs.AddParam ("doc", "", doc.CreateNavigator().Select ("*"));
2162 transform.Transform (new XmlDocument (), xsltArgs, TextWriter.Null);
2165 [Test] // bug #378239
2166 public void WhitespaceEntityInStylesheet ()
2168 string xslt = @"<?xml version='1.0' encoding='UTF-8'?>
2169 <!DOCTYPE xsl:stylesheet [
2173 <xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'>
2174 <xsl:output method='text' omit-xml-declaration='yes'/>
2176 <xsl:template match='/'>
2177 <xsl:text>&nl;Hello&nl;World</xsl:text>
2180 string expected = @"
2183 XslTransform t = new XslTransform ();
2184 t.Load (new XPathDocument (new StringReader (xslt)));
2185 StringWriter sw = new StringWriter ();
2186 t.Transform (new XPathDocument (new StringReader ("<test/>")), null, sw);
2187 Assert.AreEqual (expected, sw.ToString ());
2190 [Test] // bug #556619
2191 public void RejectCurrencySymbolAsNumber ()
2193 XslTransform xslt = new XslTransform ();
2194 StringWriter sw = new StringWriter ();
2196 @"<?xml version=""1.0""?>
2200 xmlns:xsl=""http://www.w3.org/1999/XSL/Transform""
2203 <xsl:template name=""F"">
2204 <xsl:param name=""p""/>
2206 <xsl:when test=""number($p)"">
2207 YES <xsl:value-of select=""number($p)""/>
2214 <xsl:template match=""/"">
2215 <xsl:call-template name=""F"">
2216 <xsl:with-param name=""p"">$4$2</xsl:with-param>
2217 </xsl:call-template>
2221 xslt.Load (new XmlTextReader (new StringReader (s)));
2222 xslt.Transform (new XPathDocument (new StringReader (
2223 @"<?xml version=""1.0""?>
2225 </root>")), null, sw);
2226 Assert.IsTrue (sw.ToString ().IndexOf ("NO") > 0);
2230 [Test] // bug #349375
2231 public void PreserveWhitespace ()
2233 XslCompiledTransform xslt = new XslCompiledTransform ();
2234 xslt.Load (new XmlTextReader (new StringReader (@"
2237 xmlns:xsl=""http://www.w3.org/1999/XSL/Transform""
2239 <xsl:output omit-xml-declaration='yes' />
2240 <xsl:strip-space elements='*'/>
2241 <xsl:preserve-space elements='p span'/>
2243 <xsl:template name='foo'>
2244 <xsl:for-each select='node()'>
2245 <xsl:attribute name='yes-one-node'/>
2246 <xsl:value-of select='.'/>
2248 <xsl:if test='not(node())'>
2249 <xsl:attribute name='not-node'/>
2250 <xsl:value-of select='.'/>
2254 <xsl:template match='p'>
2256 <xsl:for-each select='child::node()[position()]'>
2258 <xsl:when test='name()=""span""'>
2260 <xsl:call-template name='foo'/>
2268 </xsl:stylesheet>")));
2269 StringWriter sw = new StringWriter ();
2270 xslt.Transform (new XmlTextReader (new StringReader (@"
2278 </root>")), null, sw);
2279 Assert.AreEqual (@"<y><t yes-one-node="""">1</t><t yes-one-node=""""> </t></y>", sw.ToString ());
2282 [Test] // reverse case of #349375
2283 [Category ("NotWorking")]
2284 // [Category ("NotDotNet")]
2285 public void PreserveWhitespace2 ()
2287 XslCompiledTransform xslt = new XslCompiledTransform ();
2288 xslt.Load (new XmlTextReader (new StringReader (@"
2291 xmlns:xsl=""http://www.w3.org/1999/XSL/Transform""
2293 <xsl:output omit-xml-declaration='yes' />
2294 <xsl:preserve-space elements='*'/>
2295 <xsl:strip-space elements='p span'/>
2297 <xsl:template name='foo'>
2298 <xsl:for-each select='node()'>
2299 <xsl:attribute name='yes-one-node'/>
2300 <xsl:value-of select='.'/>
2302 <xsl:if test='not(node())'>
2303 <xsl:attribute name='not-node'/>
2304 <xsl:value-of select='.'/>
2308 <xsl:template match='p'>
2310 <xsl:for-each select='child::node()[position()]'>
2312 <xsl:when test='name()=""span""'>
2314 <xsl:call-template name='foo'/>
2322 </xsl:stylesheet>")));
2323 StringWriter sw = new StringWriter ();
2324 xslt.Transform (new XmlTextReader (new StringReader (@"
2332 </root>")), null, sw);
2333 // Assert.AreEqual (@"<y><t yes-one-node="""">1</t><t not-node=""""></t></y>", sw.ToString ());
2334 Assert.AreEqual ("\r\n \r\n <y><t yes-one-node=\"\">1</t><t not-node=\"\"></t></y>\r\n \r\n", sw.ToString ());
2338 public void CompiledTransform_Fragment () // bug #391424
2340 XslCompiledTransform xslTransform = new XslCompiledTransform ();
2341 XsltSettings settings = new XsltSettings ();
2342 settings.EnableDocumentFunction = true;
2343 xslTransform.Load ("Test/XmlFiles/xsl/391424.xsl", settings, new XmlUrlResolver ());
2344 StringWriter sw = new StringWriter ();
2345 xslTransform.Transform (new XPathDocument ("Test/XmlFiles/xsl/391424.xml", XmlSpace.Preserve), null, sw);
2346 Assert.AreEqual ("<?xml version=\"1.0\" encoding=\"utf-16\"?>Document found", sw.ToString ());
2350 public void XslTextElement_PreservesWhitespace () // bug 450797
2352 XslCompiledTransform xslt = new XslCompiledTransform ();
2353 xslt.Load (new XmlTextReader (new StringReader (@"
2355 xmlns:xsl=""http://www.w3.org/1999/XSL/Transform""
2357 <xsl:output method='text' omit-xml-declaration='yes'/>
2358 <xsl:template match='foo'>
2359 <xsl:text> </xsl:text>
2361 </xsl:stylesheet>")));
2362 StringWriter sw = new StringWriter ();
2363 xslt.Transform (new XmlTextReader (new StringReader (@"<foo>bar</foo>")), null, sw);
2364 Assert.AreEqual (" ", sw.ToString ());
2368 public void Bug487065 ()
2370 using (XmlReader input = GetInput ()) {
2371 using (XmlWriter output = XmlWriter.Create (Path.Combine(Path.GetTempPath(), "out.xml"))) {
2372 PreProcess (input, output);
2373 Assert.IsTrue (valueHasBeenSet, "#1");
2378 private static XmlReader GetInput ()
2380 return XmlReader.Create (new StringReader ("<cb:config-template xmlns:cb=\"urn:ccnet.config.builder\"><cb:define name=\"var1\">value1</cb:define></cb:config-template>"));
2383 private void PreProcess (XmlReader input, XmlWriter output)
2385 var xsltsettings = new XsltSettings (true, true);
2386 var xsltpreprocess = new XslCompiledTransform (true);
2389 new StringReader (@"
2390 <xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'
2391 xmlns:msxsl='urn:schemas-microsoft-com:xslt'
2392 xmlns:cb='urn:ccnet.config.builder'
2393 xmlns:env='environment'
2394 xmlns:exsl='http://exslt.org/common'
2395 exclude-result-prefixes='msxsl cb env exsl'>
2396 <xsl:template match='cb:define[not(*) and @name]'>
2397 <xsl:for-each select='env:define_text_constant(@name,.)'/>
2399 </xsl:stylesheet>");
2401 using (XmlReader xsltreader = XmlReader.Create (stream))
2402 xsltpreprocess.Load (xsltreader, xsltsettings, new XmlUrlResolver());
2404 var xsltargs = new XsltArgumentList ();
2406 // The XSLT calls extension functions in _current_env.
2407 xsltargs.AddExtensionObject ("environment", this);
2408 xsltpreprocess.Transform (input, xsltargs, output, null);
2411 public void define_text_constant (string name, string value)
2413 Assert.AreEqual("var1", name, "#a1");
2414 Assert.AreEqual("value1", value, "#a2");
2415 valueHasBeenSet = true;
2418 private bool valueHasBeenSet;