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
24 static readonly string end_of_line = "\r\n";
31 public void GetReady()
33 doc = new XmlDocument ();
34 xslt = new XslTransform ();
35 result = new XmlDocument ();
39 public void TestBasicTransform ()
41 string output = Path.Combine (Path.GetTempPath (), "result.xml");
42 doc.LoadXml ("<root/>");
43 xslt.Load ("Test/XmlFiles/xsl/empty.xsl");
44 xslt.Transform ("Test/XmlFiles/xsl/empty.xsl", output);
46 Assert.AreEqual (2, result.ChildNodes.Count, "count");
50 [ExpectedException (typeof (XsltCompileException))]
51 public void InvalidStylesheet ()
53 XmlDocument doc = new XmlDocument ();
54 doc.LoadXml ("<xsl:element xmlns:xsl='http://www.w3.org/1999/XSL/Transform' />");
55 XslTransform t = new XslTransform ();
60 [ExpectedException (typeof (XsltCompileException))]
61 public void EmptyStylesheet ()
63 XmlDocument doc = new XmlDocument ();
64 XslTransform t = new XslTransform ();
69 [ExpectedException (typeof (XsltCompileException))]
70 public void InvalidStylesheet2 ()
72 string xsl = @"<xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'>
73 <xsl:template match='/root'>
74 <xsl:call-template name='foo'>
75 <xsl:with-param name='name' value='text()' />
78 <xsl:template name='foo'>
79 <xsl:param name='name' />
82 <xsl:variable name='last' value='text()' />
83 <xsl:value-of select='$last' />
89 XslTransform xslt = new XslTransform ();
90 xslt.Load (new XPathDocument (new XmlTextReader (xsl, XmlNodeType.Document, null)));
94 [Category ("NotWorking")] // it depends on "mcs" existence
95 public void MsxslTest() {
96 string _styleSheet = @"
97 <xslt:stylesheet xmlns:xslt=""http://www.w3.org/1999/XSL/Transform"" version=""1.0""
98 xmlns:msxsl=""urn:schemas-microsoft-com:xslt"" xmlns:stringutils=""urn:schemas-sourceforge.net-blah"">
99 <xslt:output method=""text"" />
100 <msxsl:script language=""C#"" implements-prefix=""stringutils"">
102 string PadRight( string str, int padding) {
103 return str.PadRight(padding);
107 <xslt:template match=""test"">
108 <xslt:value-of select=""stringutils:PadRight(@name, 20)"" />
112 StringReader stringReader = new StringReader(_styleSheet);
114 XslTransform transform = new XslTransform();
115 XmlTextReader reader = new XmlTextReader(stringReader);
116 transform.Load(reader, new XmlUrlResolver(), AppDomain.CurrentDomain.Evidence);
118 StringBuilder sb = new StringBuilder();
119 StringWriter writer = new StringWriter(sb, CultureInfo.InvariantCulture);
120 XsltArgumentList arguments = new XsltArgumentList();
122 XmlDocument xmlDoc = new XmlDocument();
123 xmlDoc.LoadXml("<test name=\"test\" />");
126 transform.Transform(xmlDoc, new XsltArgumentList(), writer, new XmlUrlResolver());
128 Assert.AreEqual ("test".PadRight(20), sb.ToString());
132 public void MSXslNodeSet ()
134 string xsl = @"<xsl:stylesheet version='1.0'
135 xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns:msxsl='urn:schemas-microsoft-com:xslt'>
136 <xsl:template match='/'>
138 <xsl:variable name='var'>
139 <xsl:copy-of select='root/foo' />
141 <xsl:for-each select='msxsl:node-set($var)/foo'>
142 <xsl:value-of select='name(.)' />: <xsl:value-of select='@attr' />
147 StringWriter sw = new StringWriter ();
148 XslTransform t = new XslTransform ();
149 t.Load (new XPathDocument (new StringReader (xsl)));
150 t.Transform (new XPathDocument (new XmlTextReader (new StringReader ("<root><foo attr='A'/><foo attr='B'/><foo attr='C'/></root>"))), null, sw);
151 Assert.AreEqual (@"<?xml version=""1.0"" encoding=""utf-16""?><root xmlns:msxsl=""urn:schemas-microsoft-com:xslt"">foo: Afoo: Bfoo: C</root>", sw.ToString ());
155 [ExpectedException (typeof (XPathException))]
156 public void MSXslNodeSetRejectsNodeSet ()
158 string xsl = @"<xsl:stylesheet version='1.0'
159 xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns:msxsl='urn:schemas-microsoft-com:xslt'>
160 <xsl:template match='/'>
162 <!-- msxsl:node-set() does not accept a node set -->
163 <xsl:for-each select='msxsl:node-set(root/foo)'>
164 <xsl:value-of select='name(.)' />: <xsl:value-of select='@attr' />
169 StringWriter sw = new StringWriter ();
170 XslTransform t = new XslTransform ();
171 t.Load (new XPathDocument (new StringReader (xsl)));
172 t.Transform (new XPathDocument (new XmlTextReader (new StringReader ("<root><foo attr='A'/><foo attr='B'/><foo attr='C'/></root>"))), null, sw);
176 public void EvaluateEmptyVariableAsBoolean ()
178 string xsl = @"<xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'>
179 <xsl:template match='/'>
180 <xsl:variable name='var'><empty /></xsl:variable>
181 <root><xsl:if test='$var'>true</xsl:if></root>
184 XslTransform t = new XslTransform ();
185 t.Load (new XPathDocument (new StringReader (xsl)));
186 StringWriter sw = new StringWriter ();
188 new XPathDocument (new StringReader ("<root/>")),
191 Assert.IsTrue (sw.ToString ().IndexOf ("true") > 0);
195 [ExpectedException (typeof (XsltCompileException))]
196 public void NotAllowedPatternAxis ()
198 string xsl = @"<xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'>
199 <xsl:template match='/descendant-or-self::node()/elem'>
203 new XslTransform ().Load (new XPathDocument (
204 new StringReader (xsl)));
208 [ExpectedException (typeof (XsltCompileException))]
209 public void ImportIncorrectlyLocated ()
211 string xsl = @"<xsl:transform xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'>
212 <xsl:template match='/'></xsl:template>
213 <xsl:import href='dummy.xsl' />
215 new XslTransform ().Load (new XPathDocument (
216 new StringReader (xsl)));
219 private WeakReference StylesheetLoad (XslTransform t, string xsl)
221 XPathDocument doc = new XPathDocument (
222 new StringReader (xsl));
223 WeakReference wr = new WeakReference (doc);
228 private WeakReference StylesheetTransform (XslTransform t, string xml)
230 XPathDocument doc = new XPathDocument (
231 new StringReader (xml));
232 WeakReference wr = new WeakReference (doc);
233 t.Transform (doc, null, TextWriter.Null, null);
239 public void ErrorOnDocumentResolution ()
241 // XslTransform recovers from errors on document resolution.
242 string xslText = @"<xsl:stylesheet
243 xmlns:xsl='http://www.w3.org/1999/XSL/Transform'
245 <xsl:variable name='n'
246 select='document(""notexist.xml"")' />
247 <xsl:template match='/'>xx</xsl:template>
249 string xmlText = @"<root />";
250 XslTransform transform = new XslTransform ();
251 XPathDocument doc = new XPathDocument (
252 new XmlTextReader ("a.xsl", new StringReader (xslText)));
253 transform.Load (doc);
254 XPathDocument xmlDocument = new XPathDocument (new StringReader (xmlText));
256 StringWriter sw = new StringWriter ();
257 transform.Transform (xmlDocument, null, sw);
260 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
261 "xx", sw.ToString ());
266 public void LoadStyleFromNonRoot ()
268 XmlDocument doc = new XmlDocument ();
269 XslTransform xslt = new XslTransform ();
270 doc.LoadXml ("<root><dummy /><xsl:transform xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0' /></root>");
271 XmlNode node = doc.ChildNodes [0].ChildNodes [1];
272 xslt.Load (node, null, null);
276 public void ReturnEmptyResultsAsXmlReader ()
279 XmlDocument doc = new XmlDocument ();
280 doc.LoadXml ("<xsl:transform xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0' />");
281 XslTransform xslt = new XslTransform ();
282 xslt.Load (doc, null, null);
283 XmlReader reader = xslt.Transform(doc, null, new XmlUrlResolver ());
286 // another case - with xsl:output standalone='yes'
287 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>");
288 xslt = new XslTransform ();
289 xslt.Load (doc, null, null);
290 reader = xslt.Transform (doc, null, new XmlUrlResolver ());
292 reader.Read (); // btw no XMLdecl output.
296 // http://www.w3.org/TR/xslt#section-Creating-Elements-with-xsl:element
297 // "If the namespace attribute is not present then the QName
298 // is expanded into an expanded-name using the namespace
299 // declarations in effect for the xsl:element element,
300 // including any default namespace declaration."
301 public void LREDefaultNamespace ()
303 string xsl = @"<xsl:stylesheet version='1.0' xmlns='urn:foo' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
304 <xsl:template match='/*'>
305 <xsl:element name='{local-name()}' />
308 string xml = "<root/>";
309 XslTransform t = new XslTransform ();
310 t.Load (new XPathDocument (new StringReader (xsl)));
311 StringWriter sw = new StringWriter ();
312 XmlTextWriter xw = new XmlTextWriter (sw);
314 new XPathDocument (new StringReader (xml)),
316 Assert.AreEqual ("<root xmlns=\"urn:foo\" />",
319 string xsl2 = @"<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns='urn:foo'>
320 <xsl:template match='/*'>
322 <xsl:element name='{local-name()}' />
326 string xml2 = "<page/>";
327 t.Load (new XPathDocument (new StringReader (xsl2)));
328 sw = new StringWriter ();
329 xw = new XmlTextWriter (sw);
331 new XPathDocument (new StringReader (xml2)),
333 Assert.AreEqual ("<root xmlns=\"urn:foo\"><page /></root>",
338 // http://lists.ximian.com/pipermail/mono-devel-list/2005-November/015812.html
339 public void WhitespaceHandling ()
341 string ref_out = @"XML
342 Extensible Markup language
345 Extensible Markup language
348 Extensible Markup language
351 Extensible Markup language
355 XmlDocument d = new XmlDocument ();
356 d.Load ("Test/XmlFiles/xsl/91834.xml");
358 XslTransform t = new XslTransform ();
359 t.Load ("Test/XmlFiles/xsl/91834.xsl");
361 StringWriter sw_raw = new StringWriter ();
362 t.Transform (d, null, sw_raw);
364 Assert.AreEqual (ref_out, sw_raw.ToString ().Replace ("\r\n", "\n"));
367 // http://support.microsoft.com/default.aspx?scid=kb;en-us;829014
369 public void EmptyNodeSetSort ()
371 string xmlFragment = @"<?xml version=""1.0"" encoding=""utf-8""?>
382 <SKILL>VB.NET</SKILL>
383 <SKILL>SQl Server</SKILL>
387 string xsltFragment = @"<?xml version=""1.0""?>
388 <xsl:stylesheet version=""1.0"" xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"">
389 <xsl:output omit-xml-declaration=""yes"" />
390 <xsl:preserve-space elements=""*"" />
391 <xsl:template match=""/EMPLOYEES"">
392 <xsl:for-each select=""EMPLOYEE[DEPT='Finance']"">
393 <xsl:sort select=""NAME""/>
394 <xsl:value-of select=""NAME""/>
399 XmlTextReader xmlRdr = new XmlTextReader (new StringReader (xmlFragment));
400 XmlTextReader xsltRdr = new XmlTextReader (new StringReader (xsltFragment));
402 XslTransform stylesheet = new XslTransform ();
403 stylesheet.Load (xsltRdr, new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
405 StringWriter sw = new StringWriter ();
407 stylesheet.Transform (new XPathDocument (xmlRdr), new XsltArgumentList (),
408 sw, new XmlUrlResolver ());
410 Assert.AreEqual (0, sw.ToString ().Length);
413 // http://support.microsoft.com/default.aspx?scid=kb;en-us;834667
415 //[Category ("NotDotNet")]
416 public void LocalParameter ()
418 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
419 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
420 <xsl:param name=""param1"" select=""'global-param1-default'"" />
421 <xsl:param name=""param2"" select=""'global-param2-default'"" />
422 <xsl:output method=""text"" encoding=""ascii"" />
423 <xsl:template match=""/"">
424 <xsl:call-template name=""Test"">
425 <xsl:with-param name=""param1"" select=""'local-param1-arg'"" />
426 <xsl:with-param name=""param2"" select=""'local-param2-arg'"" />
429 <xsl:template name=""Test"">
430 <xsl:param name=""param1"" select=""'local-param1-default'"" />
431 <xsl:param name=""param2"" select=""'local-param2-default'"" />
432 <xsl:value-of select=""$param1"" /><xsl:text>/</xsl:text><xsl:value-of select=""$param2"" />
436 XmlDocument xmlDoc = new XmlDocument ();
437 xmlDoc.LoadXml ("<dummy />");
439 XslTransform xsltProcessor = new XslTransform ();
440 xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
441 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
443 StringWriter sw = new StringWriter ();
445 XsltArgumentList xsltArgs = new XsltArgumentList ();
446 xsltArgs.AddParam ("param1", string.Empty, "global-param1-arg");
447 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
449 Assert.AreEqual ("local-param1-arg/local-param2-arg", sw.ToString ());
453 public void Output_Standalone ()
455 StringWriter sw = null;
456 XsltArgumentList xsltArgs = new XsltArgumentList ();
457 XslTransform xsltProcessor = new XslTransform ();
459 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
460 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
462 <xsl:template match=""/"">
467 XmlDocument xmlDoc = new XmlDocument ();
468 xmlDoc.LoadXml ("<dummy />");
470 sw = new StringWriter ();
471 xsltProcessor.Load (new XmlTextReader (new StringReader (
472 string.Format(xsltFragment, "standalone=\"yes\""))),
473 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
474 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
477 "<?xml version=\"1.0\" encoding=\"utf-16\"" +
478 " standalone=\"yes\"?><root />", sw.ToString (), "#1");
480 sw = new StringWriter ();
481 xsltProcessor.Load (new XmlTextReader (new StringReader (
482 string.Format (xsltFragment, "standalone=\"no\""))),
483 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
484 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
487 "<?xml version=\"1.0\" encoding=\"utf-16\"" +
488 " standalone=\"no\"?><root />", sw.ToString (), "#2");
490 sw = new StringWriter ();
491 xsltProcessor.Load (new XmlTextReader (new StringReader (
492 string.Format (xsltFragment, ""))),
493 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
494 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
497 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
498 "<root />", sw.ToString (), "#3");
502 [ExpectedException (typeof (XsltCompileException))]
503 public void Output_Standalone_Invalid ()
505 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
506 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
507 <xsl:output standalone=""Yes"" />
509 XslTransform xsltProcessor = new XslTransform ();
510 xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
511 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
515 public void Output_Standalone_ForwardsCompatible ()
517 StringWriter sw = new StringWriter ();
518 XsltArgumentList xsltArgs = new XsltArgumentList ();
519 XslTransform xsltProcessor = new XslTransform ();
520 XmlDocument xmlDoc = new XmlDocument ();
521 xmlDoc.LoadXml ("<dummy />");
523 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
524 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.5"">
525 <xsl:output standalone=""{0}"" />
526 <xsl:template match=""/"">
531 // standalone is "Yes"
532 xsltProcessor.Load (new XmlTextReader (new StringReader (
533 string.Format (xsltFragment, "Yes"))),
534 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
535 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
538 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
539 "<root />", sw.ToString (), "#1");
541 // standalone is empty
542 sw.GetStringBuilder ().Length = 0;
543 xsltProcessor.Load (new XmlTextReader (new StringReader (
544 string.Format (xsltFragment, ""))),
545 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
546 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
549 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
550 "<root />", sw.ToString (), "#2");
554 [ExpectedException (typeof (XsltCompileException))]
555 public void Output_Standalone_Empty ()
557 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
558 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
559 <xsl:output standalone="""" />
561 XslTransform xsltProcessor = new XslTransform ();
562 xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
563 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
567 public void Output_OmitXmlDeclaration ()
569 StringWriter sw = null;
570 XsltArgumentList xsltArgs = new XsltArgumentList ();
571 XslTransform xsltProcessor = new XslTransform ();
573 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
574 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
576 <xsl:template match=""/"">
581 XmlDocument xmlDoc = new XmlDocument ();
582 xmlDoc.LoadXml ("<dummy />");
584 sw = new StringWriter ();
585 xsltProcessor.Load (new XmlTextReader (new StringReader (
586 string.Format (xsltFragment, "omit-xml-declaration=\"yes\""))),
587 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
588 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
590 Assert.AreEqual ("<root />", sw.ToString (), "#1");
592 sw.GetStringBuilder ().Length = 0;
593 xsltProcessor.Load (new XmlTextReader (new StringReader (
594 string.Format (xsltFragment, "omit-xml-declaration=\"no\""))),
595 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
596 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
599 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
600 "<root />", sw.ToString (), "#2");
604 [ExpectedException (typeof (XsltCompileException))]
605 public void Output_OmitXmlDeclaration_Invalid ()
607 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
608 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
609 <xsl:output omit-xml-declaration=""Yes"" />
611 XslTransform xsltProcessor = new XslTransform ();
612 xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
613 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
617 [ExpectedException (typeof (XsltCompileException))]
618 public void Output_OmitXmlDeclaration_Empty ()
620 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
621 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
622 <xsl:output omit-xml-declaration="""" />
624 XslTransform xsltProcessor = new XslTransform ();
625 xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
626 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
630 public void Output_OmitXmlDeclaration_ForwardsCompatible ()
632 StringWriter sw = new StringWriter ();
633 XsltArgumentList xsltArgs = new XsltArgumentList ();
634 XslTransform xsltProcessor = new XslTransform ();
635 XmlDocument xmlDoc = new XmlDocument ();
636 xmlDoc.LoadXml ("<dummy />");
638 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
639 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.5"">
640 <xsl:output omit-xml-declaration=""{0}"" />
641 <xsl:template match=""/"">
646 // omit-xml-declaration is "Yes"
647 xsltProcessor.Load (new XmlTextReader (new StringReader (
648 string.Format (xsltFragment, "Yes"))),
649 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
650 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
653 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
654 "<root />", sw.ToString (), "#1");
656 // omit-xml-declaration is empty
657 sw.GetStringBuilder ().Length = 0;
658 xsltProcessor.Load (new XmlTextReader (new StringReader (
659 string.Format (xsltFragment, ""))),
660 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
661 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
664 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
665 "<root />", sw.ToString (), "#2");
669 public void Output_DocType_Xml ()
671 XsltArgumentList xsltArgs = new XsltArgumentList ();
672 XslTransform xsltProcessor = new XslTransform ();
674 // set both doctype-system and doctype-public
675 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
676 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
678 doctype-public=""-//W3C//DTD XHTML 1.0 Strict//EN""
679 doctype-system=""http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"" />
680 <xsl:template match=""/"">
681 <xsl:element name=""test"">
682 <xsl:element name=""abc"" />
687 XmlDocument xmlDoc = new XmlDocument ();
688 xmlDoc.LoadXml ("<dummy />");
690 StringWriter sw = new StringWriter ();
691 xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
692 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
693 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
696 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
697 "<!DOCTYPE test PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">" +
698 "<test><abc /></test>", sw.ToString (), "#1");
700 // only set doctype-public
701 xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
702 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
704 doctype-public=""-//W3C//DTD XHTML 1.0 Strict//EN"" />
705 <xsl:template match=""/"">
706 <xsl:element name=""test"">
707 <xsl:element name=""abc"" />
712 sw.GetStringBuilder ().Length = 0;
713 xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
714 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
715 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
718 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
719 "<test><abc /></test>", sw.ToString (), "#2");
721 // only set doctype-system
722 xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
723 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
726 doctype-system=""http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"" />
727 <xsl:template match=""/"">
728 <xsl:element name=""test"">
729 <xsl:element name=""abc"" />
734 sw.GetStringBuilder ().Length = 0;
735 xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
736 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
737 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
740 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
741 "<!DOCTYPE test SYSTEM \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">" +
742 "<test><abc /></test>", sw.ToString (), "#3");
744 // set empty doctype-public and empty doctype-system
745 xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
746 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
749 doctype-system="""" />
750 <xsl:template match=""/"">
751 <xsl:element name=""test"">
752 <xsl:element name=""abc"" />
757 sw.GetStringBuilder ().Length = 0;
758 xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
759 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
760 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
763 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
764 "<!DOCTYPE test PUBLIC \"\" \"\">" +
765 "<test><abc /></test>", sw.ToString (), "#4");
767 // set empty doctype-public
768 xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
769 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
772 doctype-public="""" />
773 <xsl:template match=""/"">
774 <xsl:element name=""test"">
775 <xsl:element name=""abc"" />
780 sw.GetStringBuilder ().Length = 0;
781 xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
782 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
783 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
786 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
787 "<test><abc /></test>", sw.ToString (), "#5");
789 // set empty doctype-system
790 xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
791 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
793 doctype-system="""" />
794 <xsl:template match=""/"">
795 <xsl:element name=""test"">
796 <xsl:element name=""abc"" />
801 sw.GetStringBuilder ().Length = 0;
802 xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
803 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
804 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
807 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
808 "<!DOCTYPE test SYSTEM \"\">" +
809 "<test><abc /></test>", sw.ToString (), "#6");
813 public void Output_DocType_Html ()
815 XsltArgumentList xsltArgs = new XsltArgumentList ();
816 XslTransform xsltProcessor = new XslTransform ();
818 // set both doctype-system and doctype-public
819 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
820 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
824 doctype-public=""-//W3C//DTD XHTML 1.0 Strict//EN""
825 doctype-system=""http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"" />
826 <xsl:template match=""/"">
827 <xsl:element name=""test"">
828 <xsl:element name=""abc"" />
833 XmlDocument xmlDoc = new XmlDocument ();
834 xmlDoc.LoadXml ("<dummy />");
836 StringWriter sw = new StringWriter ();
837 xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
838 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
839 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
842 "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">" +
843 "<test><abc></abc></test>", sw.ToString (), "#1");
845 // only set doctype-public
846 xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
847 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
851 doctype-public=""-//W3C//DTD XHTML 1.0 Strict//EN"" />
852 <xsl:template match=""/"">
853 <xsl:element name=""test"">
854 <xsl:element name=""abc"" />
859 sw.GetStringBuilder ().Length = 0;
860 xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
861 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
862 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
865 "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" >" +
866 "<test><abc></abc></test>", sw.ToString (), "#2");
868 // only set doctype-system
869 xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
870 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
874 doctype-system=""http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"" />
875 <xsl:template match=""/"">
876 <xsl:element name=""test"">
877 <xsl:element name=""abc"" />
882 sw.GetStringBuilder ().Length = 0;
883 xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
884 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
885 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
888 "<!DOCTYPE html SYSTEM \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">" +
889 "<test><abc></abc></test>", sw.ToString (), "#3");
891 // set empty doctype-public and empty doctype-system
892 xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
893 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
897 doctype-public="""" doctype-system="""" />
898 <xsl:template match=""/"">
899 <xsl:element name=""test"">
900 <xsl:element name=""abc"" />
905 sw.GetStringBuilder ().Length = 0;
906 xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
907 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
908 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
911 "<!DOCTYPE html PUBLIC \"\" \"\">" +
912 "<test><abc></abc></test>", sw.ToString (), "#4");
914 // set empty doctype-public
915 xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
916 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
920 doctype-public="""" />
921 <xsl:template match=""/"">
922 <xsl:element name=""test"">
923 <xsl:element name=""abc"" />
928 sw.GetStringBuilder ().Length = 0;
929 xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
930 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
931 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
934 "<!DOCTYPE html PUBLIC \"\" >" +
935 "<test><abc></abc></test>", sw.ToString (), "#5");
937 // set empty doctype-system
938 xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
939 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
943 doctype-system="""" />
944 <xsl:template match=""/"">
945 <xsl:element name=""test"">
946 <xsl:element name=""abc"" />
951 sw.GetStringBuilder ().Length = 0;
952 xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
953 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
954 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
957 "<!DOCTYPE html SYSTEM \"\">" +
958 "<test><abc></abc></test>", sw.ToString (), "#6");
962 public void Output_Indent_Xml_DocType ()
964 XsltArgumentList xsltArgs = new XsltArgumentList ();
965 XslTransform xsltProcessor = new XslTransform ();
967 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
968 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
970 doctype-public=""-//W3C//DTD XHTML 1.0 Strict//EN""
971 doctype-system=""http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd""
973 <xsl:template match=""/"">
974 <xsl:element name=""test"">
975 <xsl:element name=""something"">
976 <xsl:element name=""else"" />
982 XmlDocument xmlDoc = new XmlDocument ();
983 xmlDoc.LoadXml ("<dummy />");
986 StringWriter sw = new StringWriter ();
987 xsltProcessor.Load (new XmlTextReader (new StringReader (
988 string.Format (xsltFragment, "indent=\"yes\""))),
989 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
990 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
992 Assert.AreEqual (string.Format(CultureInfo.InvariantCulture,
993 "<?xml version=\"1.0\" encoding=\"utf-16\"?>{0}" +
994 "<!DOCTYPE test PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">{0}" +
999 "</test>", end_of_line), sw.ToString (), "#1");
1002 sw.GetStringBuilder ().Length = 0;
1003 xsltProcessor.Load (new XmlTextReader (new StringReader (
1004 string.Format (xsltFragment, "indent=\"no\""))),
1005 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1006 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
1009 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
1010 "<!DOCTYPE test PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">" +
1011 "<test><something><else /></something></test>", sw.ToString (),
1015 sw.GetStringBuilder ().Length = 0;
1016 xsltProcessor.Load (new XmlTextReader (new StringReader (
1017 string.Format (xsltFragment, ""))),
1018 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1019 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
1022 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
1023 "<!DOCTYPE test PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">" +
1024 "<test><something><else /></something></test>", sw.ToString (),
1029 [Category ("NotWorking")] // bug #77081: mono does not output newline and indentation for non-html elements
1030 public void Output_Indent_Html_DocType ()
1032 XsltArgumentList xsltArgs = new XsltArgumentList ();
1033 XslTransform xsltProcessor = new XslTransform ();
1035 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
1036 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
1039 doctype-public=""-//W3C//DTD XHTML 1.0 Strict//EN""
1040 doctype-system=""http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd""
1042 <xsl:template match=""/"">
1043 <xsl:element name=""test"">
1044 <xsl:element name=""something"">
1045 <xsl:element name=""else"" />
1051 XmlDocument xmlDoc = new XmlDocument ();
1052 xmlDoc.LoadXml ("<dummy />");
1054 // set indent to yes
1055 StringWriter sw = new StringWriter ();
1056 xsltProcessor.Load (new XmlTextReader (new StringReader (
1057 string.Format (xsltFragment, "indent=\"yes\""))),
1058 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1059 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
1061 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
1062 "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">{0}" +
1067 " </something>{0}" +
1068 "</test>", Environment.NewLine), sw.ToString (), "#1");
1071 sw.GetStringBuilder ().Length = 0;
1072 xsltProcessor.Load (new XmlTextReader (new StringReader (
1073 string.Format (xsltFragment, "indent=\"no\""))),
1074 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1075 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
1077 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
1078 "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">" +
1079 "<test><something><else></else></something></test>",
1080 Environment.NewLine), sw.ToString (), "#2");
1083 sw.GetStringBuilder ().Length = 0;
1084 xsltProcessor.Load (new XmlTextReader (new StringReader (
1085 string.Format (xsltFragment, ""))),
1086 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1087 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
1089 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
1090 "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">{0}" +
1095 " </something>{0}" +
1096 "</test>", Environment.NewLine), sw.ToString (), "#3");
1100 public void Output_Indent_Xml ()
1102 XsltArgumentList xsltArgs = new XsltArgumentList ();
1103 XslTransform xsltProcessor = new XslTransform ();
1105 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
1106 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
1109 <xsl:template match=""/"">
1110 <xsl:element name=""test"">
1111 <xsl:element name=""something"">
1112 <xsl:element name=""else"" />
1118 XmlDocument xmlDoc = new XmlDocument ();
1119 xmlDoc.LoadXml ("<dummy />");
1121 // set indent to yes
1122 StringWriter sw = new StringWriter ();
1123 xsltProcessor.Load (new XmlTextReader (new StringReader (
1124 string.Format (xsltFragment, "indent=\"yes\""))),
1125 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1126 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
1128 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
1129 "<?xml version=\"1.0\" encoding=\"utf-16\"?>{0}" +
1133 " </something>{0}" +
1134 "</test>", end_of_line), sw.ToString (), "#1");
1137 sw.GetStringBuilder ().Length = 0;
1138 xsltProcessor.Load (new XmlTextReader (new StringReader (
1139 string.Format (xsltFragment, "indent=\"no\""))),
1140 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1141 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
1144 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
1145 "<test><something><else /></something></test>", sw.ToString (),
1149 sw.GetStringBuilder ().Length = 0;
1150 xsltProcessor.Load (new XmlTextReader (new StringReader (
1151 string.Format (xsltFragment, ""))),
1152 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1153 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
1156 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
1157 "<test><something><else /></something></test>", sw.ToString (),
1162 [Category ("NotWorking")] // bug #77081: mono does not output newline and indentation for non-html elements
1163 public void Output_Indent_Html ()
1165 XsltArgumentList xsltArgs = new XsltArgumentList ();
1166 XslTransform xsltProcessor = new XslTransform ();
1168 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
1169 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
1173 <xsl:template match=""/"">
1174 <xsl:element name=""html"">
1175 <xsl:element name=""body"">
1176 <xsl:element name=""p"" />
1177 <xsl:element name=""p"">
1178 <xsl:text>something</xsl:text>
1180 <xsl:element name=""p"">
1181 <xsl:element name=""div"" />
1183 <xsl:element name=""p"">
1184 <xsl:element name=""whatever"" />
1191 XmlDocument xmlDoc = new XmlDocument ();
1192 xmlDoc.LoadXml ("<dummy />");
1194 // set indent to yes
1195 StringWriter sw = new StringWriter ();
1196 xsltProcessor.Load (new XmlTextReader (new StringReader (
1197 string.Format (xsltFragment, "indent=\"yes\""))),
1198 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1199 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
1201 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
1206 " <p>something</p>{0}" +
1216 "</html>", Environment.NewLine), sw.ToString (), "#1");
1219 sw.GetStringBuilder ().Length = 0;
1220 xsltProcessor.Load (new XmlTextReader (new StringReader (
1221 string.Format (xsltFragment, "indent=\"no\""))),
1222 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1223 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
1225 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
1226 "<html><body><p></p><p>something</p><p><div></div></p>" +
1227 "<p><whatever></whatever></p></body></html>",
1228 Environment.NewLine), sw.ToString (), "#2");
1231 sw.GetStringBuilder ().Length = 0;
1232 xsltProcessor.Load (new XmlTextReader (new StringReader (
1233 string.Format (xsltFragment, ""))),
1234 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1235 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
1237 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
1242 " <p>something</p>{0}" +
1252 "</html>", Environment.NewLine), sw.ToString (), "#3");
1256 [ExpectedException (typeof (XsltCompileException))]
1257 public void Output_Indent_Invalid ()
1259 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
1260 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
1261 <xsl:output indent=""Yes"" />
1263 XslTransform xsltProcessor = new XslTransform ();
1264 xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
1265 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1269 [ExpectedException (typeof (XsltCompileException))]
1270 public void Output_Indent_Empty ()
1272 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
1273 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
1274 <xsl:output indent="""" />
1276 XslTransform xsltProcessor = new XslTransform ();
1277 xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
1278 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1282 public void Output_Indent_ForwardsCompatible ()
1284 StringWriter sw = new StringWriter ();
1285 XsltArgumentList xsltArgs = new XsltArgumentList ();
1286 XslTransform xsltProcessor = new XslTransform ();
1287 XmlDocument xmlDoc = new XmlDocument ();
1288 xmlDoc.LoadXml ("<dummy />");
1290 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
1291 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.5"">
1292 <xsl:output indent=""{0}"" />
1293 <xsl:template match=""/"">
1299 xsltProcessor.Load (new XmlTextReader (new StringReader (
1300 string.Format (xsltFragment, "Yes"))),
1301 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1302 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
1305 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
1306 "<root />", sw.ToString (), "#1");
1309 sw.GetStringBuilder ().Length = 0;
1310 xsltProcessor.Load (new XmlTextReader (new StringReader (
1311 string.Format (xsltFragment, ""))),
1312 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1313 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
1316 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
1317 "<root />", sw.ToString (), "#2");
1321 public void Output_MediaType ()
1323 StringWriter sw = null;
1324 XsltArgumentList xsltArgs = new XsltArgumentList ();
1325 XslTransform xsltProcessor = new XslTransform ();
1327 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
1328 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
1329 <xsl:output media-type=""whatever"" />
1330 <xsl:template match=""/"">
1335 XmlDocument xmlDoc = new XmlDocument ();
1336 xmlDoc.LoadXml ("<dummy />");
1338 sw = new StringWriter ();
1339 xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
1340 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1341 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
1344 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
1345 "<root />", sw.ToString ());
1349 public void Output_Encoding_TextWriter ()
1351 StringWriter sw = null;
1352 XsltArgumentList xsltArgs = new XsltArgumentList ();
1353 XslTransform xsltProcessor = new XslTransform ();
1355 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
1356 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
1358 <xsl:template match=""/"">
1363 XmlDocument xmlDoc = new XmlDocument ();
1364 xmlDoc.LoadXml ("<dummy />");
1367 sw = new StringWriter ();
1368 xsltProcessor.Load (new XmlTextReader (new StringReader (
1369 string.Format (xsltFragment, string.Empty))),
1370 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1371 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
1374 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
1375 "<root />", sw.ToString (), "#1");
1378 sw.GetStringBuilder ().Length = 0;
1379 xsltProcessor.Load (new XmlTextReader (new StringReader (
1380 string.Format(xsltFragment, "encoding=\"iso-8859-1\""))),
1381 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1382 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
1385 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
1386 "<root />", sw.ToString (), "#1");
1389 sw.GetStringBuilder ().Length = 0;
1390 xsltProcessor.Load (new XmlTextReader (new StringReader (
1391 string.Format (xsltFragment, "encoding=\"doesnotexist\""))),
1392 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1393 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
1396 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
1397 "<root />", sw.ToString (), "#2");
1400 sw.GetStringBuilder ().Length = 0;
1401 xsltProcessor.Load (new XmlTextReader (new StringReader (
1402 string.Format (xsltFragment, "encoding=\"\""))),
1403 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1404 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
1407 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
1408 "<root />", sw.ToString (), "#3");
1412 public void Output_Encoding_Stream ()
1414 MemoryStream ms = null;
1415 string result = null;
1416 XsltArgumentList xsltArgs = new XsltArgumentList ();
1417 XslTransform xsltProcessor = new XslTransform ();
1419 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
1420 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
1422 <xsl:template match=""/"">
1427 XmlDocument xmlDoc = new XmlDocument ();
1428 xmlDoc.LoadXml ("<dummy />");
1431 ms = new MemoryStream ();
1432 xsltProcessor.Load (new XmlTextReader (new StringReader (
1433 string.Format (xsltFragment, string.Empty))),
1434 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1435 xsltProcessor.Transform (xmlDoc, xsltArgs, ms, new XmlUrlResolver ());
1437 using (StreamReader sr = new StreamReader (ms, true)) {
1438 result = sr.ReadToEnd ();
1442 "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
1443 "<root />", result, "#1");
1446 ms = new MemoryStream ();
1447 xsltProcessor.Load (new XmlTextReader (new StringReader (
1448 string.Format (xsltFragment, "encoding=\"iso-8859-1\""))),
1449 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1450 xsltProcessor.Transform (xmlDoc, xsltArgs, ms, new XmlUrlResolver ());
1452 using (StreamReader sr = new StreamReader (ms, true)) {
1453 result = sr.ReadToEnd ();
1457 "<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>" +
1458 "<root />", result, "#2");
1461 ms = new MemoryStream ();
1462 xsltProcessor.Load (new XmlTextReader (new StringReader (
1463 string.Format (xsltFragment, "encoding=\"doesnotexist\""))),
1464 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1465 xsltProcessor.Transform (xmlDoc, xsltArgs, ms, new XmlUrlResolver ());
1467 using (StreamReader sr = new StreamReader (ms, true)) {
1468 result = sr.ReadToEnd ();
1472 "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
1473 "<root />", result, "#3");
1476 ms = new MemoryStream ();
1477 xsltProcessor.Load (new XmlTextReader (new StringReader (
1478 string.Format (xsltFragment, "encoding=\"\""))),
1479 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1480 xsltProcessor.Transform (xmlDoc, xsltArgs, ms, new XmlUrlResolver ());
1482 using (StreamReader sr = new StreamReader (ms, true)) {
1483 result = sr.ReadToEnd ();
1487 "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
1488 "<root />", result, "#4");
1492 public void Output_Version ()
1494 StringWriter sw = null;
1495 XsltArgumentList xsltArgs = new XsltArgumentList ();
1496 XslTransform xsltProcessor = new XslTransform ();
1498 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
1499 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
1500 <xsl:output version=""{0}"" />
1501 <xsl:template match=""/"">
1506 XmlDocument xmlDoc = new XmlDocument ();
1507 xmlDoc.LoadXml ("<dummy />");
1510 sw = new StringWriter ();
1511 xsltProcessor.Load (new XmlTextReader (new StringReader (
1512 string.Format (xsltFragment, "1.0"))),
1513 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1514 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
1517 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
1518 "<root />", sw.ToString (), "#1");
1521 sw.GetStringBuilder ().Length = 0;
1522 xsltProcessor.Load (new XmlTextReader (new StringReader (
1523 string.Format (xsltFragment, "2.0"))),
1524 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1525 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
1528 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
1529 "<root />", sw.ToString (), "#2");
1532 sw.GetStringBuilder ().Length = 0;
1533 xsltProcessor.Load (new XmlTextReader (new StringReader (
1534 string.Format (xsltFragment, "BLABLA"))),
1535 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1536 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
1539 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
1540 "<root />", sw.ToString (), "#3");
1544 public void Output_Method_Html_TextWriter ()
1546 string options = null;
1547 StringWriter sw = null;
1548 XsltArgumentList xsltArgs = new XsltArgumentList ();
1549 XslTransform xsltProcessor = new XslTransform ();
1551 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
1552 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
1553 <xsl:output method=""html"" {0} />
1554 <xsl:template match=""/"">
1555 <xsl:element name=""html"">
1556 <xsl:element name=""head"">
1557 <xsl:element name=""title"">Output Test</xsl:element>
1559 <xsl:element name=""Body"">
1560 <xsl:element name=""BR"" />
1566 XmlDocument xmlDoc = new XmlDocument ();
1567 xmlDoc.LoadXml ("<dummy />");
1569 // indent not set, media-type not set
1570 sw = new StringWriter ();
1571 xsltProcessor.Load (new XmlTextReader (new StringReader (
1572 string.Format (xsltFragment, string.Empty))),
1573 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1574 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
1576 Assert.AreEqual (string.Format(CultureInfo.InvariantCulture,
1579 "{1}{1}<META http-equiv=\"Content-Type\" content=\"text/html; charset=utf-16\">{0}" +
1580 "{1}{1}<title>Output Test</title>{0}" +
1585 "</html>", end_of_line, " "), sw.ToString (), "#1");
1587 // indent no, media-type not set
1588 options = "indent=\"no\"";
1589 sw.GetStringBuilder ().Length = 0;
1590 xsltProcessor.Load (new XmlTextReader (new StringReader (
1591 string.Format (xsltFragment, options))),
1592 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1593 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
1595 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
1598 "{1}{1}<META http-equiv=\"Content-Type\" content=\"text/html; charset=utf-16\">{0}" +
1599 "{1}{1}<title>Output Test</title>{0}" +
1604 "</html>", string.Empty, string.Empty), sw.ToString (), "#2");
1606 // indent yes, media-type "bla", omit-xml-declaration "no"
1607 options = "indent=\"yes\" media-type=\"bla\"" +
1608 " encoding=\"iso-8859-1\" omit-xml-declaration=\"no\"";
1609 sw.GetStringBuilder ().Length = 0;
1610 xsltProcessor.Load (new XmlTextReader (new StringReader (
1611 string.Format (xsltFragment, options))),
1612 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1613 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
1615 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
1618 "{1}{1}<META http-equiv=\"Content-Type\" content=\"bla; charset=utf-16\">{0}" +
1619 "{1}{1}<title>Output Test</title>{0}" +
1624 "</html>", end_of_line, " "), sw.ToString (), "#3");
1628 public void Output_Method_Html_Stream ()
1630 string options = null;
1631 MemoryStream ms = null;
1632 string result = null;
1633 XsltArgumentList xsltArgs = new XsltArgumentList ();
1634 XslTransform xsltProcessor = new XslTransform ();
1636 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
1637 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
1638 <xsl:output method=""html"" {0} />
1639 <xsl:template match=""/"">
1640 <xsl:element name=""html"">
1641 <xsl:element name=""head"">
1642 <xsl:element name=""title"">Output Test</xsl:element>
1644 <xsl:element name=""Body"">
1645 <xsl:element name=""BR"" />
1651 XmlDocument xmlDoc = new XmlDocument ();
1652 xmlDoc.LoadXml ("<dummy />");
1654 // indent not set, media-type not set
1655 ms = new MemoryStream ();
1656 xsltProcessor.Load (new XmlTextReader (new StringReader (
1657 string.Format (xsltFragment, string.Empty))),
1658 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1659 xsltProcessor.Transform (xmlDoc, xsltArgs, ms, new XmlUrlResolver ());
1661 using (StreamReader sr = new StreamReader (ms, true)) {
1662 result = sr.ReadToEnd ();
1665 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
1668 "{1}{1}<META http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">{0}" +
1669 "{1}{1}<title>Output Test</title>{0}" +
1674 "</html>", end_of_line, " "), result, "#1");
1676 // indent no, media-type not set
1677 options = "indent=\"no\"";
1678 ms = new MemoryStream ();
1679 xsltProcessor.Load (new XmlTextReader (new StringReader (
1680 string.Format (xsltFragment, options))),
1681 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1682 xsltProcessor.Transform (xmlDoc, xsltArgs, ms, new XmlUrlResolver ());
1684 using (StreamReader sr = new StreamReader (ms, true)) {
1685 result = sr.ReadToEnd ();
1688 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
1691 "{1}{1}<META http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">{0}" +
1692 "{1}{1}<title>Output Test</title>{0}" +
1697 "</html>", string.Empty, string.Empty), result, "#2");
1699 // indent yes, media-type "bla", omit-xml-declaration "no"
1700 options = "indent=\"yes\" media-type=\"bla\"" +
1701 " encoding=\"iso-8859-1\" omit-xml-declaration=\"no\"";
1702 ms = new MemoryStream ();
1703 xsltProcessor.Load (new XmlTextReader (new StringReader (
1704 string.Format (xsltFragment, options))),
1705 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1706 xsltProcessor.Transform (xmlDoc, xsltArgs, ms, new XmlUrlResolver ());
1708 using (StreamReader sr = new StreamReader (ms, true)) {
1709 result = sr.ReadToEnd ();
1712 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
1715 "{1}{1}<META http-equiv=\"Content-Type\" content=\"bla; charset=iso-8859-1\">{0}" +
1716 "{1}{1}<title>Output Test</title>{0}" +
1721 "</html>", end_of_line, " "), result, "#3");
1725 [ExpectedException (typeof (XsltCompileException))]
1726 public void Output_Unknown_Attribute ()
1728 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
1729 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
1730 <xsl:output whatever="""" />
1732 XslTransform xsltProcessor = new XslTransform ();
1733 xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
1734 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1738 public void Output_Unknown_Attribute_ForwardsCompatible ()
1740 StringWriter sw = new StringWriter ();
1741 XsltArgumentList xsltArgs = new XsltArgumentList ();
1742 XslTransform xsltProcessor = new XslTransform ();
1743 XmlDocument xmlDoc = new XmlDocument ();
1744 xmlDoc.LoadXml ("<dummy />");
1746 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
1747 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.5"">
1748 <xsl:output whatever="""" />
1749 <xsl:template match=""/"">
1754 xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
1755 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1756 xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
1759 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
1760 "<root />", sw.ToString (), "#1");
1764 public void Output_Unknown_Attribute_NonDefaultNamespace ()
1766 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
1767 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" xmlns:tst=""something"" version=""1.0"">
1768 <xsl:output tst:whatever="""" />
1770 XslTransform xsltProcessor = new XslTransform ();
1771 xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
1772 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1775 // http://support.microsoft.com/kb/832757/en-us
1777 public void FormatNumber_KB_832757 ()
1779 string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8""?>
1780 <xsl:stylesheet version=""1.0"" xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"">
1781 <xsl:output method=""xml"" version=""1.0"" encoding=""UTF-8"" indent=""yes"" />
1782 <xsl:template match=""/"">
1784 <xsl:apply-templates />
1787 <xsl:template match=""number"">
1788 <tr><td><xsl:value-of select=""format-number(.,'#,##0;(#,##0)')""/></td></tr>
1792 XmlDocument xmlDoc = new XmlDocument ();
1793 xmlDoc.LoadXml ("<root><number>1000</number></root>");
1795 StringWriter sw = new StringWriter ();
1796 XslTransform xsltProcessor = new XslTransform ();
1797 xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
1798 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1799 xsltProcessor.Transform (xmlDoc, new XsltArgumentList (), sw,
1800 new XmlUrlResolver ());
1802 Assert.AreEqual (string.Format(CultureInfo.InvariantCulture,
1803 "<?xml version=\"1.0\" encoding=\"utf-16\"?>{0}" +
1806 " <td>1,000</td>{0}" +
1808 "</table>", end_of_line), sw.ToString ());
1811 // http://support.microsoft.com/kb/293469/en-us
1813 public void FormatNumber_KB_293469 ()
1815 string xsltFragment = @"<?xml version=""1.0""?>
1816 <xsl:stylesheet version=""1.0"" xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"">
1817 <xsl:output method=""xml"" indent=""yes"" />
1818 <xsl:decimal-format name=""european"" decimal-separator="","" grouping-separator=""."" />
1819 <xsl:template match=""/"">
1820 <xsl:element name=""html"">
1821 <xsl:element name=""body"">
1822 <xsl:apply-templates select=""root/amount"" />
1826 <xsl:template match=""amount"">
1827 <xsl:value-of select=""format-number(., '###.###,00', 'european')""/>
1831 XmlDocument xmlDoc = new XmlDocument ();
1832 xmlDoc.LoadXml ("<root><amount currency='USD'>44442.7</amount></root>");
1834 StringWriter sw = new StringWriter ();
1835 XslTransform xsltProcessor = new XslTransform ();
1836 xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
1837 new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
1838 xsltProcessor.Transform (xmlDoc, new XsltArgumentList (), sw,
1839 new XmlUrlResolver ());
1841 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
1842 "<?xml version=\"1.0\" encoding=\"utf-16\"?>{0}" +
1844 " <body>44.442,70</body>{0}" +
1845 "</html>", end_of_line), sw.ToString ());
1849 [Category ("NotDotNet")]
1850 // MS bug: the output must be well-formed XML general entity
1851 // (doctype must not appear after text nodes).
1852 public void DocTypeAfterText ()
1855 <xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
1856 <xsl:output doctype-system='system'/>
1857 <xsl:template match='/'>
1858 <xsl:text xml:space='preserve'> a </xsl:text>
1862 XslTransform t = new XslTransform ();
1863 t.Load (new XmlTextReader (xsl, XmlNodeType.Document, null));
1864 XmlDocument doc = new XmlDocument ();
1866 t.Transform (new XPathDocument (
1867 new StringReader ("<root/>")),
1868 null, TextWriter.Null);
1869 Assert.Fail ("should fail; doctype is not allowed after whitespace. See XSLT 1.0 section 16.1.");
1875 public void StripSpace ()
1889 XslTransform t = new XslTransform ();
1890 t.Load ("Test/XmlFiles/xsl/stripspace.xsl");
1891 XPathDocument d = new XPathDocument (
1892 "Test/XmlFiles/xsl/stripspace.xml", XmlSpace.Preserve);
1893 StringWriter sw = new StringWriter ();
1894 t.Transform (d, null, sw);
1895 Assert.AreEqual (result, sw.ToString ());
1899 public void CurrentInSelect ()
1901 XslTransform t = new XslTransform ();
1902 t.Load ("Test/XmlFiles/xsl/current-in-select.xsl");
1903 XPathDocument d = new XPathDocument (
1904 "Test/XmlFiles/xsl/current-in-select.xml", XmlSpace.Preserve);
1905 StringWriter sw = new StringWriter ();
1906 t.Transform (d, null, sw);
1907 using (StreamReader sr = File.OpenText (
1908 "Test/XmlFiles/xsl/current-in-select.ref")) {
1909 string s = sr.ReadToEnd ();
1910 Assert.AreEqual (s, sw.ToString ());
1915 public void CallTemplateSignificantWhitespace ()
1918 string xsl = @"<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
1919 <xsl:template name='foo' xml:space='preserve'>
1920 <xsl:call-template name='bar'>
1921 <xsl:with-param name='hoge' select='hoge' />
1922 </xsl:call-template>
1925 <xsl:template name='bar'>
1928 XslTransform t = new XslTransform ();
1929 t.Load (new XmlTextReader (new StringReader (xsl)));
1930 t.Transform (new XPathDocument (new StringReader ("<dummy/>")), null, new XmlTextWriter (TextWriter.Null));
1934 public void Bug82493 ()
1936 XslTransform transformationObj = new XslTransform ();
1937 transformationObj.Load ("Test/XmlFiles/xsl/82493.xsl");
1938 XmlDocument doc = new XmlDocument ();
1939 doc.Load ("Test/XmlFiles/xsl/82493.xml");
1940 XslExtensionClass GetCalculation = new XslExtensionClass ("a4");
1941 XsltArgumentList xslExtensionArgList = new XsltArgumentList ();
1942 xslExtensionArgList.AddExtensionObject ("urn:e", GetCalculation);
1943 XmlTextWriter writer = new XmlTextWriter (TextWriter.Null);
1944 transformationObj.Transform (doc, xslExtensionArgList, writer, null);
1949 public void BugNovell325482 ()
1951 XmlDocument doc = new XmlDocument ();
1952 doc.Load ("Test/XmlFiles/xsl/325482.xml");
1953 XslTransform xt = new XslTransform ();
1954 xt.Load ("Test/XmlFiles/xsl/325482.xsl");
1955 xt.Transform (doc, null, TextWriter.Null);
1958 public class XslExtensionClass
1960 private string paperType = String.Empty;
1962 public XslExtensionClass (string paperType)
1964 this.paperType = paperType;
1967 public int GetPageDimensions ()
1969 switch (this.paperType) {
1975 throw new ArgumentException ("Unknown page size type: " + this.paperType);
1980 [Test] // bug #348786
1981 public void ValueOfContainsExternalElements ()
1984 <xsl:stylesheet version=""1.0"" xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"">
1985 <xsl:template match=""x"">
1987 <xsl:value-of select=""@bar"">
1988 <!-- enter comment here -->
1993 new XslTransform ().Load (new XmlTextReader (xsl, XmlNodeType.Document, null));
1996 [Test] // bug #349035
1997 public void CompareRTFAsStringNotNodeset ()
1999 XslTransform xslt = new XslTransform ();
2000 xslt.Load (new XmlTextReader (new StringReader (@"
2001 <xsl:stylesheet version=""1.0""
2002 xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"">
2003 <xsl:template name=""foo"">
2004 <xsl:param name=""bar""/>
2005 <xsl:if test=""$bar!=''"">
2006 <bar>bar is not empty:'<xsl:value-of select=""$bar""/>'</bar>
2008 <xsl:if test=""$bar=''"">
2009 <bar>bar is empty</bar>
2012 <xsl:template match=""zap"">
2013 <xsl:call-template name=""foo"">
2014 <xsl:with-param name=""bar"">
2015 <xsl:for-each select=""@bar"">
2016 <xsl:value-of select="".""/>
2019 </xsl:call-template>
2023 XPathDocument input = new XPathDocument (new StringReader (
2029 StringWriter sw = new StringWriter ();
2030 XmlTextWriter xtw = new XmlTextWriter (sw);
2031 xslt.Transform (input, null, xtw);
2032 string expected = "<bar>bar is not empty:'HaHa'</bar><bar>bar is empty</bar>";
2033 Assert.AreEqual (expected, sw.ToString ());
2037 public void Bug349111 ()
2039 XslTransform xslt = new XslTransform ();
2040 xslt.Load (new XmlTextReader (new StringReader (@"
2041 <xsl:stylesheet version=""1.0"" xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"">
2042 <xsl:template match=""book"">
2043 <xsl:for-each select=""child::node()[position()]"">
2045 <xsl:value-of select="".""/>
2051 XPathDocument input = new XPathDocument (new StringReader (@"
2053 <book> <title lang=""eng"">Harry Potter</title> <price>29.99</price> </book>
2056 StringWriter sw = new StringWriter ();
2057 xslt.Transform (input, null, new XmlTextWriter (sw));
2058 string expected = "<yyy>Harry Potter</yyy><yyy>29.99</yyy>";
2059 Assert.AreEqual (expected, sw.ToString ());
2063 public void Bug351939 ()
2065 XslTransform xslt = new XslTransform ();
2066 xslt.Load (new XmlTextReader (new StringReader (
2067 @"<xsl:stylesheet version=""1.0""
2068 xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"">
2069 <xsl:key name=""thekey"" match=""aa"" use=""''""/>
2070 <xsl:key name=""thekey"" match=""ab"" use=""''""/>
2071 <xsl:template match=""root"">
2073 <foo><xsl:value-of select=""key('thekey','')[1]""/></foo>
2074 <bar><xsl:value-of select=""key('thekey','')[2]""/></bar>
2075 <baz><xsl:value-of select=""key('thekey','')[3]""/></baz>
2076 <tem><xsl:value-of select=""key('thekey','')[4]""/></tem>
2079 </xsl:stylesheet>")));
2080 StringWriter sw = new StringWriter ();
2081 xslt.Transform (new XPathDocument (new StringReader (
2082 @"<?xml version=""1.0""?>
2092 </root>")), null, new XmlTextWriter (sw));
2093 Assert.AreEqual ("<x><foo>1</foo><bar>2</bar><baz>3</baz><tem>4</tem></x>", sw.ToString ());
2097 public void CopyOfIXPathNavigable ()
2100 <xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'
2101 xmlns:foo='urn:Foo'>
2102 <xsl:template match='/'>
2103 <xsl:copy-of select='foo:MyCustomFunction()'/>
2109 <given-name age='10'>
2111 <nick-name>Freddy</nick-name>
2113 <family-name>Smith</family-name>
2116 <given-name age='10'>
2118 <nick-name>Bob</nick-name>
2120 <family-name>Smith</family-name>
2123 XslTransform t = new XslTransform ();
2124 t.Load (new XPathDocument (new StringReader (xsl)));
2125 XsltArgumentList args = new XsltArgumentList();
2126 args.AddExtensionObject ("urn:Foo", new CopyOfIXPathNavigableClass ());
2127 StringWriter sw = new StringWriter ();
2128 t.Transform (new XPathDocument (new StringReader (xml)), args, new XmlTextWriter (sw));
2129 Assert.AreEqual ("<root><child0 /><child1 /></root>", sw.ToString ());
2132 public class CopyOfIXPathNavigableClass
2134 public object MyCustomFunction ()
2136 XmlDocument doc = new XmlDocument ();
2137 doc .LoadXml ("<root><child0 /><child1 /></root>");
2138 return doc.DocumentElement;
2142 [Test] // bug #316238
2143 public void ResolveVariableInXsltArgumentList ()
2145 ResolveVariableInXsltArgumentList ("Test/XmlFiles/xsl/316238-1.xsl");
2146 ResolveVariableInXsltArgumentList ("Test/XmlFiles/xsl/316238-2.xsl");
2149 void ResolveVariableInXsltArgumentList (string file)
2151 XmlDocument doc = new XmlDocument ();
2152 doc.LoadXml ("<doc><element id=\"test\">this is a test</element></doc>");
2153 XslTransform transform = new XslTransform ();
2154 transform.Load (file);
2155 //Stream outputStream = Console.OpenStandardOutput();
2156 XsltArgumentList xsltArgs = new XsltArgumentList ();
2157 xsltArgs.AddParam ("test", "", "test");
2158 xsltArgs.AddParam ("doc", "", doc.CreateNavigator().Select ("*"));
2159 transform.Transform (new XmlDocument (), xsltArgs, TextWriter.Null);
2162 [Test] // bug #378239
2163 public void WhitespaceEntityInStylesheet ()
2165 string xslt = @"<?xml version='1.0' encoding='UTF-8'?>
2166 <!DOCTYPE xsl:stylesheet [
2170 <xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'>
2171 <xsl:output method='text' omit-xml-declaration='yes'/>
2173 <xsl:template match='/'>
2174 <xsl:text>&nl;Hello&nl;World</xsl:text>
2177 string expected = @"
2180 XslTransform t = new XslTransform ();
2181 t.Load (new XPathDocument (new StringReader (xslt)));
2182 StringWriter sw = new StringWriter ();
2183 t.Transform (new XPathDocument (new StringReader ("<test/>")), null, sw);
2184 Assert.AreEqual (expected, sw.ToString ());
2187 [Test] // bug #556619
2188 public void RejectCurrencySymbolAsNumber ()
2190 XslTransform xslt = new XslTransform ();
2191 StringWriter sw = new StringWriter ();
2193 @"<?xml version=""1.0""?>
2197 xmlns:xsl=""http://www.w3.org/1999/XSL/Transform""
2200 <xsl:template name=""F"">
2201 <xsl:param name=""p""/>
2203 <xsl:when test=""number($p)"">
2204 YES <xsl:value-of select=""number($p)""/>
2211 <xsl:template match=""/"">
2212 <xsl:call-template name=""F"">
2213 <xsl:with-param name=""p"">$4$2</xsl:with-param>
2214 </xsl:call-template>
2218 xslt.Load (new XmlTextReader (new StringReader (s)));
2219 xslt.Transform (new XPathDocument (new StringReader (
2220 @"<?xml version=""1.0""?>
2222 </root>")), null, sw);
2223 Assert.IsTrue (sw.ToString ().IndexOf ("NO") > 0);
2226 [Test] // bug #349375
2227 public void PreserveWhitespace ()
2229 XslCompiledTransform xslt = new XslCompiledTransform ();
2230 xslt.Load (new XmlTextReader (new StringReader (@"
2233 xmlns:xsl=""http://www.w3.org/1999/XSL/Transform""
2235 <xsl:output omit-xml-declaration='yes' />
2236 <xsl:strip-space elements='*'/>
2237 <xsl:preserve-space elements='p span'/>
2239 <xsl:template name='foo'>
2240 <xsl:for-each select='node()'>
2241 <xsl:attribute name='yes-one-node'/>
2242 <xsl:value-of select='.'/>
2244 <xsl:if test='not(node())'>
2245 <xsl:attribute name='not-node'/>
2246 <xsl:value-of select='.'/>
2250 <xsl:template match='p'>
2252 <xsl:for-each select='child::node()[position()]'>
2254 <xsl:when test='name()=""span""'>
2256 <xsl:call-template name='foo'/>
2264 </xsl:stylesheet>")));
2265 StringWriter sw = new StringWriter ();
2266 xslt.Transform (new XmlTextReader (new StringReader (@"
2274 </root>")), null, sw);
2275 Assert.AreEqual (@"<y><t yes-one-node="""">1</t><t yes-one-node=""""> </t></y>", sw.ToString ());
2278 [Test] // reverse case of #349375
2279 [Category ("NotWorking")]
2280 // [Category ("NotDotNet")]
2281 public void PreserveWhitespace2 ()
2283 XslCompiledTransform xslt = new XslCompiledTransform ();
2284 xslt.Load (new XmlTextReader (new StringReader (@"
2287 xmlns:xsl=""http://www.w3.org/1999/XSL/Transform""
2289 <xsl:output omit-xml-declaration='yes' />
2290 <xsl:preserve-space elements='*'/>
2291 <xsl:strip-space elements='p span'/>
2293 <xsl:template name='foo'>
2294 <xsl:for-each select='node()'>
2295 <xsl:attribute name='yes-one-node'/>
2296 <xsl:value-of select='.'/>
2298 <xsl:if test='not(node())'>
2299 <xsl:attribute name='not-node'/>
2300 <xsl:value-of select='.'/>
2304 <xsl:template match='p'>
2306 <xsl:for-each select='child::node()[position()]'>
2308 <xsl:when test='name()=""span""'>
2310 <xsl:call-template name='foo'/>
2318 </xsl:stylesheet>")));
2319 StringWriter sw = new StringWriter ();
2320 xslt.Transform (new XmlTextReader (new StringReader (@"
2328 </root>")), null, sw);
2329 // Assert.AreEqual (@"<y><t yes-one-node="""">1</t><t not-node=""""></t></y>", sw.ToString ());
2330 Assert.AreEqual ("\r\n \r\n <y><t yes-one-node=\"\">1</t><t not-node=\"\"></t></y>\r\n \r\n".Replace ("\r\n", Environment.NewLine), sw.ToString ());
2334 public void CompiledTransform_Fragment () // bug #391424
2336 XslCompiledTransform xslTransform = new XslCompiledTransform ();
2337 XsltSettings settings = new XsltSettings ();
2338 settings.EnableDocumentFunction = true;
2339 xslTransform.Load ("Test/XmlFiles/xsl/391424.xsl", settings, new XmlUrlResolver ());
2340 StringWriter sw = new StringWriter ();
2341 xslTransform.Transform (new XPathDocument ("Test/XmlFiles/xsl/391424.xml", XmlSpace.Preserve), null, sw);
2342 Assert.AreEqual ("<?xml version=\"1.0\" encoding=\"utf-16\"?>Document found", sw.ToString ());
2346 public void XslTextElement_PreservesWhitespace () // bug 450797
2348 XslCompiledTransform xslt = new XslCompiledTransform ();
2349 xslt.Load (new XmlTextReader (new StringReader (@"
2351 xmlns:xsl=""http://www.w3.org/1999/XSL/Transform""
2353 <xsl:output method='text' omit-xml-declaration='yes'/>
2354 <xsl:template match='foo'>
2355 <xsl:text> </xsl:text>
2357 </xsl:stylesheet>")));
2358 StringWriter sw = new StringWriter ();
2359 xslt.Transform (new XmlTextReader (new StringReader (@"<foo>bar</foo>")), null, sw);
2360 Assert.AreEqual (" ", sw.ToString ());
2364 [Category ("NotWorking")] // FIXME: SRE related regression
2365 public void Bug487065 ()
2367 using (XmlReader input = GetInput ()) {
2368 using (XmlWriter output = XmlWriter.Create (Path.Combine(Path.GetTempPath(), "out.xml"))) {
2369 PreProcess (input, output);
2370 Assert.IsTrue (valueHasBeenSet, "#1");
2375 private static XmlReader GetInput ()
2377 return XmlReader.Create (new StringReader ("<cb:config-template xmlns:cb=\"urn:ccnet.config.builder\"><cb:define name=\"var1\">value1</cb:define></cb:config-template>"));
2380 private void PreProcess (XmlReader input, XmlWriter output)
2382 var xsltsettings = new XsltSettings (true, true);
2383 var xsltpreprocess = new XslCompiledTransform (true);
2386 new StringReader (@"
2387 <xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'
2388 xmlns:msxsl='urn:schemas-microsoft-com:xslt'
2389 xmlns:cb='urn:ccnet.config.builder'
2390 xmlns:env='environment'
2391 xmlns:exsl='http://exslt.org/common'
2392 exclude-result-prefixes='msxsl cb env exsl'>
2393 <xsl:template match='cb:define[not(*) and @name]'>
2394 <xsl:for-each select='env:define_text_constant(@name,.)'/>
2396 </xsl:stylesheet>");
2398 using (XmlReader xsltreader = XmlReader.Create (stream))
2399 xsltpreprocess.Load (xsltreader, xsltsettings, new XmlUrlResolver());
2401 var xsltargs = new XsltArgumentList ();
2403 // The XSLT calls extension functions in _current_env.
2404 xsltargs.AddExtensionObject ("environment", this);
2405 xsltpreprocess.Transform (input, xsltargs, output, null);
2408 public void define_text_constant (string name, string value)
2410 Assert.AreEqual("var1", name, "#a1");
2411 Assert.AreEqual("value1", value, "#a2");
2412 valueHasBeenSet = true;
2415 private bool valueHasBeenSet;
2418 public void IncludeProcessStylesheet ()
2420 string includedXsl = @"<?xml version='1.0' ?>
2421 <xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns:doc='http://nwalsh.com/xsl/documentation/1.0' exclude-result-prefixes='doc' version='1.0'>
2422 <doc:template name='foo' />
2423 <xsl:template name='foo'>
2427 string file = Path.Combine (Path.GetTempPath (), "include.xsl");
2428 StreamWriter includedWriter = new StreamWriter (file);
2429 includedWriter.WriteLine (includedXsl);
2430 includedWriter.Close ();
2431 XslCompiledTransform transform = new XslCompiledTransform ();
2432 string xsl = @"<?xml version='1.0' ?>
2433 <xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'>
2434 <xsl:include href='include.xsl' />
2435 <xsl:template match='/'>
2436 <xsl:call-template name='foo' />
2438 </xsl:stylesheet>".Replace ("include.xsl", file);
2439 XmlReader xslReader = XmlReader.Create (new StringReader (xsl));
2440 transform.Load (xslReader);
2441 XmlReader inputReader = XmlReader.Create (new StringReader ("<bar />"));
2442 var sw = new StringWriter ();
2443 XmlWriter outputWriter = XmlWriter.Create (sw);
2444 transform.Transform (inputReader, outputWriter);
2445 outputWriter.Close ();
2446 Assert.AreEqual ("<?xml version=\"1.0\" encoding=\"utf-16\"?><foo />", sw.ToString (), "#1");