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 public void MsxslTest() {
95 string _styleSheet
= @"
96 <xslt:stylesheet xmlns:xslt=""http://www.w3.org/1999/XSL/Transform"" version=""1.0""
97 xmlns:msxsl=""urn:schemas-microsoft-com:xslt"" xmlns:stringutils=""urn:schemas-sourceforge.net-blah"">
98 <xslt:output method=""text"" />
99 <msxsl:script language=""C#"" implements-prefix=""stringutils"">
101 string PadRight( string str, int padding) {
102 return str.PadRight(padding);
106 <xslt:template match=""test"">
107 <xslt:value-of select=""stringutils:PadRight(@name, 20)"" />
111 StringReader stringReader
= new StringReader(_styleSheet
);
113 XslTransform transform
= new XslTransform();
114 XmlTextReader reader
= new XmlTextReader(stringReader
);
115 transform
.Load(reader
, new XmlUrlResolver(), AppDomain
.CurrentDomain
.Evidence
);
117 StringBuilder sb
= new StringBuilder();
118 StringWriter writer
= new StringWriter(sb
, CultureInfo
.InvariantCulture
);
119 XsltArgumentList arguments
= new XsltArgumentList();
121 XmlDocument xmlDoc
= new XmlDocument();
122 xmlDoc
.LoadXml("<test name=\"test\" />");
125 transform
.Transform(xmlDoc
, new XsltArgumentList(), writer
, new XmlUrlResolver());
127 Assert
.AreEqual ("test".PadRight(20), sb
.ToString());
131 public void MSXslNodeSet ()
133 string xsl
= @"<xsl:stylesheet version='1.0'
134 xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns:msxsl='urn:schemas-microsoft-com:xslt'>
135 <xsl:template match='/'>
137 <xsl:variable name='var'>
138 <xsl:copy-of select='root/foo' />
140 <xsl:for-each select='msxsl:node-set($var)/foo'>
141 <xsl:value-of select='name(.)' />: <xsl:value-of select='@attr' />
146 StringWriter sw
= new StringWriter ();
147 XslTransform t
= new XslTransform ();
148 t
.Load (new XPathDocument (new StringReader (xsl
)));
149 t
.Transform (new XPathDocument (new XmlTextReader (new StringReader ("<root><foo attr='A'/><foo attr='B'/><foo attr='C'/></root>"))), null, sw
);
150 Assert
.AreEqual (@"<?xml version=""1.0"" encoding=""utf-16""?><root xmlns:msxsl=""urn:schemas-microsoft-com:xslt"">foo: Afoo: Bfoo: C</root>", sw
.ToString ());
154 [ExpectedException (typeof (XPathException
))]
155 public void MSXslNodeSetRejectsNodeSet ()
157 string xsl
= @"<xsl:stylesheet version='1.0'
158 xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns:msxsl='urn:schemas-microsoft-com:xslt'>
159 <xsl:template match='/'>
161 <!-- msxsl:node-set() does not accept a node set -->
162 <xsl:for-each select='msxsl:node-set(root/foo)'>
163 <xsl:value-of select='name(.)' />: <xsl:value-of select='@attr' />
168 StringWriter sw
= new StringWriter ();
169 XslTransform t
= new XslTransform ();
170 t
.Load (new XPathDocument (new StringReader (xsl
)));
171 t
.Transform (new XPathDocument (new XmlTextReader (new StringReader ("<root><foo attr='A'/><foo attr='B'/><foo attr='C'/></root>"))), null, sw
);
175 [Category ("MobileNotWorking")]
176 public void MSXslFormatDate ()
178 var arguments
= new XsltArgumentList();
179 arguments
.AddParam("date", "", new DateTime (2010, 11, 22, 5, 4, 3));
182 <xsl:stylesheet version=""1.0"" xmlns=""http://www.w3.org/1999/xhtml"" xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" xmlns:msxsl=""urn:schemas-microsoft-com:xslt"" exclude-result-prefixes=""msxsl"">
183 <xsl:param name='date'/>
184 <xsl:template match='/'>
186 <p>The current date is <xsl:value-of select=""msxsl:format-date($date, 'd MMMM yyyy')""/> and current time is <xsl:value-of select=""msxsl:format-time($date, 'HH:mm')""/>.</p>
191 StringWriter sw
= new StringWriter ();
192 var t
= new XslCompiledTransform ();
193 t
.Load (new XPathDocument (new StringReader (xsl
)));
195 t
.Transform (new XPathDocument (new XmlTextReader (new StringReader ("<root></root>"))), arguments
, sw
);
197 Assert
.AreEqual ("<?xml version=\"1.0\" encoding=\"utf-16\"?><root xmlns=\"http://www.w3.org/1999/xhtml\"><p>The current date is 22 November 2010 and current time is 05:04.</p></root>", sw
.ToString ());
202 public void EvaluateEmptyVariableAsBoolean ()
204 string xsl
= @"<xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'>
205 <xsl:template match='/'>
206 <xsl:variable name='var'><empty /></xsl:variable>
207 <root><xsl:if test='$var'>true</xsl:if></root>
210 XslTransform t
= new XslTransform ();
211 t
.Load (new XPathDocument (new StringReader (xsl
)));
212 StringWriter sw
= new StringWriter ();
214 new XPathDocument (new StringReader ("<root/>")),
217 Assert
.IsTrue (sw
.ToString ().IndexOf ("true") > 0);
221 [ExpectedException (typeof (XsltCompileException
))]
222 public void NotAllowedPatternAxis ()
224 string xsl
= @"<xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'>
225 <xsl:template match='/descendant-or-self::node()/elem'>
229 new XslTransform ().Load (new XPathDocument (
230 new StringReader (xsl
)));
234 [ExpectedException (typeof (XsltCompileException
))]
235 public void ImportIncorrectlyLocated ()
237 string xsl
= @"<xsl:transform xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'>
238 <xsl:template match='/'></xsl:template>
239 <xsl:import href='dummy.xsl' />
241 new XslTransform ().Load (new XPathDocument (
242 new StringReader (xsl
)));
245 private WeakReference
StylesheetLoad (XslTransform t
, string xsl
)
247 XPathDocument doc
= new XPathDocument (
248 new StringReader (xsl
));
249 WeakReference wr
= new WeakReference (doc
);
254 private WeakReference
StylesheetTransform (XslTransform t
, string xml
)
256 XPathDocument doc
= new XPathDocument (
257 new StringReader (xml
));
258 WeakReference wr
= new WeakReference (doc
);
259 t
.Transform (doc
, null, TextWriter
.Null
, null);
265 public void ErrorOnDocumentResolution ()
267 // XslTransform recovers from errors on document resolution.
268 string xslText
= @"<xsl:stylesheet
269 xmlns:xsl='http://www.w3.org/1999/XSL/Transform'
271 <xsl:variable name='n'
272 select='document(""notexist.xml"")' />
273 <xsl:template match='/'>xx</xsl:template>
275 string xmlText
= @"<root />";
276 XslTransform transform
= new XslTransform ();
277 XPathDocument doc
= new XPathDocument (
278 new XmlTextReader ("a.xsl", new StringReader (xslText
)));
279 transform
.Load (doc
);
280 XPathDocument xmlDocument
= new XPathDocument (new StringReader (xmlText
));
282 StringWriter sw
= new StringWriter ();
283 transform
.Transform (xmlDocument
, null, sw
);
286 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
287 "xx", sw
.ToString ());
292 public void LoadStyleFromNonRoot ()
294 XmlDocument doc
= new XmlDocument ();
295 XslTransform xslt
= new XslTransform ();
296 doc
.LoadXml ("<root><dummy /><xsl:transform xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0' /></root>");
297 XmlNode node
= doc
.ChildNodes
[0].ChildNodes
[1];
298 xslt
.Load (node
, null, null);
302 public void ReturnEmptyResultsAsXmlReader ()
305 XmlDocument doc
= new XmlDocument ();
306 doc
.LoadXml ("<xsl:transform xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0' />");
307 XslTransform xslt
= new XslTransform ();
308 xslt
.Load (doc
, null, null);
309 XmlReader reader
= xslt
.Transform(doc
, null, new XmlUrlResolver ());
312 // another case - with xsl:output standalone='yes'
313 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>");
314 xslt
= new XslTransform ();
315 xslt
.Load (doc
, null, null);
316 reader
= xslt
.Transform (doc
, null, new XmlUrlResolver ());
318 reader
.Read (); // btw no XMLdecl output.
322 // http://www.w3.org/TR/xslt#section-Creating-Elements-with-xsl:element
323 // "If the namespace attribute is not present then the QName
324 // is expanded into an expanded-name using the namespace
325 // declarations in effect for the xsl:element element,
326 // including any default namespace declaration."
327 public void LREDefaultNamespace ()
329 string xsl
= @"<xsl:stylesheet version='1.0' xmlns='urn:foo' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
330 <xsl:template match='/*'>
331 <xsl:element name='{local-name()}' />
334 string xml
= "<root/>";
335 XslTransform t
= new XslTransform ();
336 t
.Load (new XPathDocument (new StringReader (xsl
)));
337 StringWriter sw
= new StringWriter ();
338 XmlTextWriter xw
= new XmlTextWriter (sw
);
340 new XPathDocument (new StringReader (xml
)),
342 Assert
.AreEqual ("<root xmlns=\"urn:foo\" />",
345 string xsl2
= @"<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns='urn:foo'>
346 <xsl:template match='/*'>
348 <xsl:element name='{local-name()}' />
352 string xml2
= "<page/>";
353 t
.Load (new XPathDocument (new StringReader (xsl2
)));
354 sw
= new StringWriter ();
355 xw
= new XmlTextWriter (sw
);
357 new XPathDocument (new StringReader (xml2
)),
359 Assert
.AreEqual ("<root xmlns=\"urn:foo\"><page /></root>",
364 // http://lists.ximian.com/pipermail/mono-devel-list/2005-November/015812.html
365 public void WhitespaceHandling ()
367 string ref_out
= @"XML
368 Extensible Markup language
371 Extensible Markup language
374 Extensible Markup language
377 Extensible Markup language
381 XmlDocument d
= new XmlDocument ();
382 d
.Load ("Test/XmlFiles/xsl/91834.xml");
384 XslTransform t
= new XslTransform ();
385 t
.Load ("Test/XmlFiles/xsl/91834.xsl");
387 StringWriter sw_raw
= new StringWriter ();
388 t
.Transform (d
, null, sw_raw
);
390 Assert
.AreEqual (ref_out
, sw_raw
.ToString ().Replace ("\r\n", "\n"));
393 // http://support.microsoft.com/default.aspx?scid=kb;en-us;829014
395 public void EmptyNodeSetSort ()
397 string xmlFragment
= @"<?xml version=""1.0"" encoding=""utf-8""?>
408 <SKILL>VB.NET</SKILL>
409 <SKILL>SQl Server</SKILL>
413 string xsltFragment
= @"<?xml version=""1.0""?>
414 <xsl:stylesheet version=""1.0"" xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"">
415 <xsl:output omit-xml-declaration=""yes"" />
416 <xsl:preserve-space elements=""*"" />
417 <xsl:template match=""/EMPLOYEES"">
418 <xsl:for-each select=""EMPLOYEE[DEPT='Finance']"">
419 <xsl:sort select=""NAME""/>
420 <xsl:value-of select=""NAME""/>
425 XmlTextReader xmlRdr
= new XmlTextReader (new StringReader (xmlFragment
));
426 XmlTextReader xsltRdr
= new XmlTextReader (new StringReader (xsltFragment
));
428 XslTransform stylesheet
= new XslTransform ();
429 stylesheet
.Load (xsltRdr
, new XmlUrlResolver (), AppDomain
.CurrentDomain
.Evidence
);
431 StringWriter sw
= new StringWriter ();
433 stylesheet
.Transform (new XPathDocument (xmlRdr
), new XsltArgumentList (),
434 sw
, new XmlUrlResolver ());
436 Assert
.AreEqual (0, sw
.ToString ().Length
);
439 // http://support.microsoft.com/default.aspx?scid=kb;en-us;834667
441 //[Category ("NotDotNet")]
442 public void LocalParameter ()
444 string xsltFragment
= @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
445 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
446 <xsl:param name=""param1"" select=""'global-param1-default'"" />
447 <xsl:param name=""param2"" select=""'global-param2-default'"" />
448 <xsl:output method=""text"" encoding=""ascii"" />
449 <xsl:template match=""/"">
450 <xsl:call-template name=""Test"">
451 <xsl:with-param name=""param1"" select=""'local-param1-arg'"" />
452 <xsl:with-param name=""param2"" select=""'local-param2-arg'"" />
455 <xsl:template name=""Test"">
456 <xsl:param name=""param1"" select=""'local-param1-default'"" />
457 <xsl:param name=""param2"" select=""'local-param2-default'"" />
458 <xsl:value-of select=""$param1"" /><xsl:text>/</xsl:text><xsl:value-of select=""$param2"" />
462 XmlDocument xmlDoc
= new XmlDocument ();
463 xmlDoc
.LoadXml ("<dummy />");
465 XslTransform xsltProcessor
= new XslTransform ();
466 xsltProcessor
.Load (new XmlTextReader (new StringReader (xsltFragment
)),
467 new XmlUrlResolver (), AppDomain
.CurrentDomain
.Evidence
);
469 StringWriter sw
= new StringWriter ();
471 XsltArgumentList xsltArgs
= new XsltArgumentList ();
472 xsltArgs
.AddParam ("param1", string.Empty
, "global-param1-arg");
473 xsltProcessor
.Transform (xmlDoc
, xsltArgs
, sw
, new XmlUrlResolver ());
475 Assert
.AreEqual ("local-param1-arg/local-param2-arg", sw
.ToString ());
479 public void Output_Standalone ()
481 StringWriter sw
= null;
482 XsltArgumentList xsltArgs
= new XsltArgumentList ();
483 XslTransform xsltProcessor
= new XslTransform ();
485 string xsltFragment
= @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
486 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
488 <xsl:template match=""/"">
493 XmlDocument xmlDoc
= new XmlDocument ();
494 xmlDoc
.LoadXml ("<dummy />");
496 sw
= new StringWriter ();
497 xsltProcessor
.Load (new XmlTextReader (new StringReader (
498 string.Format(xsltFragment
, "standalone=\"yes\""))),
499 new XmlUrlResolver (), AppDomain
.CurrentDomain
.Evidence
);
500 xsltProcessor
.Transform (xmlDoc
, xsltArgs
, sw
, new XmlUrlResolver ());
503 "<?xml version=\"1.0\" encoding=\"utf-16\"" +
504 " standalone=\"yes\"?><root />", sw
.ToString (), "#1");
506 sw
= new StringWriter ();
507 xsltProcessor
.Load (new XmlTextReader (new StringReader (
508 string.Format (xsltFragment
, "standalone=\"no\""))),
509 new XmlUrlResolver (), AppDomain
.CurrentDomain
.Evidence
);
510 xsltProcessor
.Transform (xmlDoc
, xsltArgs
, sw
, new XmlUrlResolver ());
513 "<?xml version=\"1.0\" encoding=\"utf-16\"" +
514 " standalone=\"no\"?><root />", sw
.ToString (), "#2");
516 sw
= new StringWriter ();
517 xsltProcessor
.Load (new XmlTextReader (new StringReader (
518 string.Format (xsltFragment
, ""))),
519 new XmlUrlResolver (), AppDomain
.CurrentDomain
.Evidence
);
520 xsltProcessor
.Transform (xmlDoc
, xsltArgs
, sw
, new XmlUrlResolver ());
523 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
524 "<root />", sw
.ToString (), "#3");
528 [ExpectedException (typeof (XsltCompileException
))]
529 public void Output_Standalone_Invalid ()
531 string xsltFragment
= @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
532 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
533 <xsl:output standalone=""Yes"" />
535 XslTransform xsltProcessor
= new XslTransform ();
536 xsltProcessor
.Load (new XmlTextReader (new StringReader (xsltFragment
)),
537 new XmlUrlResolver (), AppDomain
.CurrentDomain
.Evidence
);
541 public void Output_Standalone_ForwardsCompatible ()
543 StringWriter sw
= new StringWriter ();
544 XsltArgumentList xsltArgs
= new XsltArgumentList ();
545 XslTransform xsltProcessor
= new XslTransform ();
546 XmlDocument xmlDoc
= new XmlDocument ();
547 xmlDoc
.LoadXml ("<dummy />");
549 string xsltFragment
= @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
550 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.5"">
551 <xsl:output standalone=""{0}"" />
552 <xsl:template match=""/"">
557 // standalone is "Yes"
558 xsltProcessor
.Load (new XmlTextReader (new StringReader (
559 string.Format (xsltFragment
, "Yes"))),
560 new XmlUrlResolver (), AppDomain
.CurrentDomain
.Evidence
);
561 xsltProcessor
.Transform (xmlDoc
, xsltArgs
, sw
, new XmlUrlResolver ());
564 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
565 "<root />", sw
.ToString (), "#1");
567 // standalone is empty
568 sw
.GetStringBuilder ().Length
= 0;
569 xsltProcessor
.Load (new XmlTextReader (new StringReader (
570 string.Format (xsltFragment
, ""))),
571 new XmlUrlResolver (), AppDomain
.CurrentDomain
.Evidence
);
572 xsltProcessor
.Transform (xmlDoc
, xsltArgs
, sw
, new XmlUrlResolver ());
575 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
576 "<root />", sw
.ToString (), "#2");
580 [ExpectedException (typeof (XsltCompileException
))]
581 public void Output_Standalone_Empty ()
583 string xsltFragment
= @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
584 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
585 <xsl:output standalone="""" />
587 XslTransform xsltProcessor
= new XslTransform ();
588 xsltProcessor
.Load (new XmlTextReader (new StringReader (xsltFragment
)),
589 new XmlUrlResolver (), AppDomain
.CurrentDomain
.Evidence
);
593 public void Output_OmitXmlDeclaration ()
595 StringWriter sw
= null;
596 XsltArgumentList xsltArgs
= new XsltArgumentList ();
597 XslTransform xsltProcessor
= new XslTransform ();
599 string xsltFragment
= @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
600 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
602 <xsl:template match=""/"">
607 XmlDocument xmlDoc
= new XmlDocument ();
608 xmlDoc
.LoadXml ("<dummy />");
610 sw
= new StringWriter ();
611 xsltProcessor
.Load (new XmlTextReader (new StringReader (
612 string.Format (xsltFragment
, "omit-xml-declaration=\"yes\""))),
613 new XmlUrlResolver (), AppDomain
.CurrentDomain
.Evidence
);
614 xsltProcessor
.Transform (xmlDoc
, xsltArgs
, sw
, new XmlUrlResolver ());
616 Assert
.AreEqual ("<root />", sw
.ToString (), "#1");
618 sw
.GetStringBuilder ().Length
= 0;
619 xsltProcessor
.Load (new XmlTextReader (new StringReader (
620 string.Format (xsltFragment
, "omit-xml-declaration=\"no\""))),
621 new XmlUrlResolver (), AppDomain
.CurrentDomain
.Evidence
);
622 xsltProcessor
.Transform (xmlDoc
, xsltArgs
, sw
, new XmlUrlResolver ());
625 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
626 "<root />", sw
.ToString (), "#2");
630 [ExpectedException (typeof (XsltCompileException
))]
631 public void Output_OmitXmlDeclaration_Invalid ()
633 string xsltFragment
= @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
634 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
635 <xsl:output omit-xml-declaration=""Yes"" />
637 XslTransform xsltProcessor
= new XslTransform ();
638 xsltProcessor
.Load (new XmlTextReader (new StringReader (xsltFragment
)),
639 new XmlUrlResolver (), AppDomain
.CurrentDomain
.Evidence
);
643 [ExpectedException (typeof (XsltCompileException
))]
644 public void Output_OmitXmlDeclaration_Empty ()
646 string xsltFragment
= @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
647 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
648 <xsl:output omit-xml-declaration="""" />
650 XslTransform xsltProcessor
= new XslTransform ();
651 xsltProcessor
.Load (new XmlTextReader (new StringReader (xsltFragment
)),
652 new XmlUrlResolver (), AppDomain
.CurrentDomain
.Evidence
);
656 public void Output_OmitXmlDeclaration_ForwardsCompatible ()
658 StringWriter sw
= new StringWriter ();
659 XsltArgumentList xsltArgs
= new XsltArgumentList ();
660 XslTransform xsltProcessor
= new XslTransform ();
661 XmlDocument xmlDoc
= new XmlDocument ();
662 xmlDoc
.LoadXml ("<dummy />");
664 string xsltFragment
= @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
665 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.5"">
666 <xsl:output omit-xml-declaration=""{0}"" />
667 <xsl:template match=""/"">
672 // omit-xml-declaration is "Yes"
673 xsltProcessor
.Load (new XmlTextReader (new StringReader (
674 string.Format (xsltFragment
, "Yes"))),
675 new XmlUrlResolver (), AppDomain
.CurrentDomain
.Evidence
);
676 xsltProcessor
.Transform (xmlDoc
, xsltArgs
, sw
, new XmlUrlResolver ());
679 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
680 "<root />", sw
.ToString (), "#1");
682 // omit-xml-declaration is empty
683 sw
.GetStringBuilder ().Length
= 0;
684 xsltProcessor
.Load (new XmlTextReader (new StringReader (
685 string.Format (xsltFragment
, ""))),
686 new XmlUrlResolver (), AppDomain
.CurrentDomain
.Evidence
);
687 xsltProcessor
.Transform (xmlDoc
, xsltArgs
, sw
, new XmlUrlResolver ());
690 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
691 "<root />", sw
.ToString (), "#2");
695 public void Output_DocType_Xml ()
697 XsltArgumentList xsltArgs
= new XsltArgumentList ();
698 XslTransform xsltProcessor
= new XslTransform ();
700 // set both doctype-system and doctype-public
701 string 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 doctype-system=""http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"" />
706 <xsl:template match=""/"">
707 <xsl:element name=""test"">
708 <xsl:element name=""abc"" />
713 XmlDocument xmlDoc
= new XmlDocument ();
714 xmlDoc
.LoadXml ("<dummy />");
716 StringWriter sw
= new StringWriter ();
717 xsltProcessor
.Load (new XmlTextReader (new StringReader (xsltFragment
)),
718 new XmlUrlResolver (), AppDomain
.CurrentDomain
.Evidence
);
719 xsltProcessor
.Transform (xmlDoc
, xsltArgs
, sw
, new XmlUrlResolver ());
722 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
723 "<!DOCTYPE test PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">" +
724 "<test><abc /></test>", sw
.ToString (), "#1");
726 // only set doctype-public
727 xsltFragment
= @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
728 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
730 doctype-public=""-//W3C//DTD XHTML 1.0 Strict//EN"" />
731 <xsl:template match=""/"">
732 <xsl:element name=""test"">
733 <xsl:element name=""abc"" />
738 sw
.GetStringBuilder ().Length
= 0;
739 xsltProcessor
.Load (new XmlTextReader (new StringReader (xsltFragment
)),
740 new XmlUrlResolver (), AppDomain
.CurrentDomain
.Evidence
);
741 xsltProcessor
.Transform (xmlDoc
, xsltArgs
, sw
, new XmlUrlResolver ());
744 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
745 "<test><abc /></test>", sw
.ToString (), "#2");
747 // only set 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=""http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"" />
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 SYSTEM \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">" +
768 "<test><abc /></test>", sw
.ToString (), "#3");
770 // set empty doctype-public and empty doctype-system
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-system="""" />
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 "<!DOCTYPE test PUBLIC \"\" \"\">" +
791 "<test><abc /></test>", sw
.ToString (), "#4");
793 // set empty doctype-public
794 xsltFragment
= @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
795 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
798 doctype-public="""" />
799 <xsl:template match=""/"">
800 <xsl:element name=""test"">
801 <xsl:element name=""abc"" />
806 sw
.GetStringBuilder ().Length
= 0;
807 xsltProcessor
.Load (new XmlTextReader (new StringReader (xsltFragment
)),
808 new XmlUrlResolver (), AppDomain
.CurrentDomain
.Evidence
);
809 xsltProcessor
.Transform (xmlDoc
, xsltArgs
, sw
, new XmlUrlResolver ());
812 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
813 "<test><abc /></test>", sw
.ToString (), "#5");
815 // set empty doctype-system
816 xsltFragment
= @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
817 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
819 doctype-system="""" />
820 <xsl:template match=""/"">
821 <xsl:element name=""test"">
822 <xsl:element name=""abc"" />
827 sw
.GetStringBuilder ().Length
= 0;
828 xsltProcessor
.Load (new XmlTextReader (new StringReader (xsltFragment
)),
829 new XmlUrlResolver (), AppDomain
.CurrentDomain
.Evidence
);
830 xsltProcessor
.Transform (xmlDoc
, xsltArgs
, sw
, new XmlUrlResolver ());
833 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
834 "<!DOCTYPE test SYSTEM \"\">" +
835 "<test><abc /></test>", sw
.ToString (), "#6");
839 public void Output_DocType_Html ()
841 XsltArgumentList xsltArgs
= new XsltArgumentList ();
842 XslTransform xsltProcessor
= new XslTransform ();
844 // set both doctype-system and doctype-public
845 string xsltFragment
= @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
846 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
850 doctype-public=""-//W3C//DTD XHTML 1.0 Strict//EN""
851 doctype-system=""http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"" />
852 <xsl:template match=""/"">
853 <xsl:element name=""test"">
854 <xsl:element name=""abc"" />
859 XmlDocument xmlDoc
= new XmlDocument ();
860 xmlDoc
.LoadXml ("<dummy />");
862 StringWriter sw
= new StringWriter ();
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\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">" +
869 "<test><abc></abc></test>", sw
.ToString (), "#1");
871 // only set doctype-public
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-public=""-//W3C//DTD XHTML 1.0 Strict//EN"" />
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 PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" >" +
892 "<test><abc></abc></test>", sw
.ToString (), "#2");
894 // only set 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-system=""http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"" />
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 SYSTEM \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">" +
915 "<test><abc></abc></test>", sw
.ToString (), "#3");
917 // set empty doctype-public and empty doctype-system
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="""" doctype-system="""" />
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 (), "#4");
940 // set empty doctype-public
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-public="""" />
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 PUBLIC \"\" >" +
961 "<test><abc></abc></test>", sw
.ToString (), "#5");
963 // set empty doctype-system
964 xsltFragment
= @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
965 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
969 doctype-system="""" />
970 <xsl:template match=""/"">
971 <xsl:element name=""test"">
972 <xsl:element name=""abc"" />
977 sw
.GetStringBuilder ().Length
= 0;
978 xsltProcessor
.Load (new XmlTextReader (new StringReader (xsltFragment
)),
979 new XmlUrlResolver (), AppDomain
.CurrentDomain
.Evidence
);
980 xsltProcessor
.Transform (xmlDoc
, xsltArgs
, sw
, new XmlUrlResolver ());
983 "<!DOCTYPE html SYSTEM \"\">" +
984 "<test><abc></abc></test>", sw
.ToString (), "#6");
988 public void Output_Indent_Xml_DocType ()
990 XsltArgumentList xsltArgs
= new XsltArgumentList ();
991 XslTransform xsltProcessor
= new XslTransform ();
993 string xsltFragment
= @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
994 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
996 doctype-public=""-//W3C//DTD XHTML 1.0 Strict//EN""
997 doctype-system=""http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd""
999 <xsl:template match=""/"">
1000 <xsl:element name=""test"">
1001 <xsl:element name=""something"">
1002 <xsl:element name=""else"" />
1008 XmlDocument xmlDoc
= new XmlDocument ();
1009 xmlDoc
.LoadXml ("<dummy />");
1011 // set indent to yes
1012 StringWriter sw
= new StringWriter ();
1013 xsltProcessor
.Load (new XmlTextReader (new StringReader (
1014 string.Format (xsltFragment
, "indent=\"yes\""))),
1015 new XmlUrlResolver (), AppDomain
.CurrentDomain
.Evidence
);
1016 xsltProcessor
.Transform (xmlDoc
, xsltArgs
, sw
, new XmlUrlResolver ());
1018 Assert
.AreEqual (string.Format(CultureInfo
.InvariantCulture
,
1019 "<?xml version=\"1.0\" encoding=\"utf-16\"?>{0}" +
1020 "<!DOCTYPE test PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">{0}" +
1024 " </something>{0}" +
1025 "</test>", end_of_line
), sw
.ToString (), "#1");
1028 sw
.GetStringBuilder ().Length
= 0;
1029 xsltProcessor
.Load (new XmlTextReader (new StringReader (
1030 string.Format (xsltFragment
, "indent=\"no\""))),
1031 new XmlUrlResolver (), AppDomain
.CurrentDomain
.Evidence
);
1032 xsltProcessor
.Transform (xmlDoc
, xsltArgs
, sw
, new XmlUrlResolver ());
1035 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
1036 "<!DOCTYPE test PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">" +
1037 "<test><something><else /></something></test>", sw
.ToString (),
1041 sw
.GetStringBuilder ().Length
= 0;
1042 xsltProcessor
.Load (new XmlTextReader (new StringReader (
1043 string.Format (xsltFragment
, ""))),
1044 new XmlUrlResolver (), AppDomain
.CurrentDomain
.Evidence
);
1045 xsltProcessor
.Transform (xmlDoc
, xsltArgs
, sw
, new XmlUrlResolver ());
1048 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
1049 "<!DOCTYPE test PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">" +
1050 "<test><something><else /></something></test>", sw
.ToString (),
1055 public void Output_Indent_Html_DocType ()
1057 XsltArgumentList xsltArgs
= new XsltArgumentList ();
1058 XslTransform xsltProcessor
= new XslTransform ();
1060 string xsltFragment
= @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
1061 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
1064 doctype-public=""-//W3C//DTD XHTML 1.0 Strict//EN""
1065 doctype-system=""http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd""
1067 <xsl:template match=""/"">
1068 <xsl:element name=""test"">
1069 <xsl:element name=""something"">
1070 <xsl:element name=""else"" />
1076 XmlDocument xmlDoc
= new XmlDocument ();
1077 xmlDoc
.LoadXml ("<dummy />");
1079 // set indent to yes
1080 StringWriter sw
= new StringWriter ();
1081 xsltProcessor
.Load (new XmlTextReader (new StringReader (
1082 string.Format (xsltFragment
, "indent=\"yes\""))),
1083 new XmlUrlResolver (), AppDomain
.CurrentDomain
.Evidence
);
1084 xsltProcessor
.Transform (xmlDoc
, xsltArgs
, sw
, new XmlUrlResolver ());
1086 Assert
.AreEqual (string.Format (CultureInfo
.InvariantCulture
,
1087 "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">{0}" +
1092 " </something>{0}" +
1093 "</test>", end_of_line
), sw
.ToString (), "#1");
1096 sw
.GetStringBuilder ().Length
= 0;
1097 xsltProcessor
.Load (new XmlTextReader (new StringReader (
1098 string.Format (xsltFragment
, "indent=\"no\""))),
1099 new XmlUrlResolver (), AppDomain
.CurrentDomain
.Evidence
);
1100 xsltProcessor
.Transform (xmlDoc
, xsltArgs
, sw
, new XmlUrlResolver ());
1102 Assert
.AreEqual (string.Format (CultureInfo
.InvariantCulture
,
1103 "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">" +
1104 "<test><something><else></else></something></test>",
1105 Environment
.NewLine
), sw
.ToString (), "#2");
1108 sw
.GetStringBuilder ().Length
= 0;
1109 xsltProcessor
.Load (new XmlTextReader (new StringReader (
1110 string.Format (xsltFragment
, ""))),
1111 new XmlUrlResolver (), AppDomain
.CurrentDomain
.Evidence
);
1112 xsltProcessor
.Transform (xmlDoc
, xsltArgs
, sw
, new XmlUrlResolver ());
1114 Assert
.AreEqual (string.Format (CultureInfo
.InvariantCulture
,
1115 "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">{0}" +
1120 " </something>{0}" +
1121 "</test>", end_of_line
), sw
.ToString (), "#3");
1125 public void Output_Indent_Xml ()
1127 XsltArgumentList xsltArgs
= new XsltArgumentList ();
1128 XslTransform xsltProcessor
= new XslTransform ();
1130 string xsltFragment
= @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
1131 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
1134 <xsl:template match=""/"">
1135 <xsl:element name=""test"">
1136 <xsl:element name=""something"">
1137 <xsl:element name=""else"" />
1143 XmlDocument xmlDoc
= new XmlDocument ();
1144 xmlDoc
.LoadXml ("<dummy />");
1146 // set indent to yes
1147 StringWriter sw
= new StringWriter ();
1148 xsltProcessor
.Load (new XmlTextReader (new StringReader (
1149 string.Format (xsltFragment
, "indent=\"yes\""))),
1150 new XmlUrlResolver (), AppDomain
.CurrentDomain
.Evidence
);
1151 xsltProcessor
.Transform (xmlDoc
, xsltArgs
, sw
, new XmlUrlResolver ());
1153 Assert
.AreEqual (string.Format (CultureInfo
.InvariantCulture
,
1154 "<?xml version=\"1.0\" encoding=\"utf-16\"?>{0}" +
1158 " </something>{0}" +
1159 "</test>", end_of_line
), sw
.ToString (), "#1");
1162 sw
.GetStringBuilder ().Length
= 0;
1163 xsltProcessor
.Load (new XmlTextReader (new StringReader (
1164 string.Format (xsltFragment
, "indent=\"no\""))),
1165 new XmlUrlResolver (), AppDomain
.CurrentDomain
.Evidence
);
1166 xsltProcessor
.Transform (xmlDoc
, xsltArgs
, sw
, new XmlUrlResolver ());
1169 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
1170 "<test><something><else /></something></test>", sw
.ToString (),
1174 sw
.GetStringBuilder ().Length
= 0;
1175 xsltProcessor
.Load (new XmlTextReader (new StringReader (
1176 string.Format (xsltFragment
, ""))),
1177 new XmlUrlResolver (), AppDomain
.CurrentDomain
.Evidence
);
1178 xsltProcessor
.Transform (xmlDoc
, xsltArgs
, sw
, new XmlUrlResolver ());
1181 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
1182 "<test><something><else /></something></test>", sw
.ToString (),
1187 public void Output_Indent_Html ()
1189 XsltArgumentList xsltArgs
= new XsltArgumentList ();
1190 XslTransform xsltProcessor
= new XslTransform ();
1192 string xsltFragment
= @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
1193 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
1197 <xsl:template match=""/"">
1198 <xsl:element name=""html"">
1199 <xsl:element name=""body"">
1200 <xsl:element name=""p"" />
1201 <xsl:element name=""p"">
1202 <xsl:text>something</xsl:text>
1204 <xsl:element name=""p"">
1205 <xsl:element name=""div"" />
1207 <xsl:element name=""p"">
1208 <xsl:element name=""whatever"" />
1215 XmlDocument xmlDoc
= new XmlDocument ();
1216 xmlDoc
.LoadXml ("<dummy />");
1218 // set indent to yes
1219 StringWriter sw
= new StringWriter ();
1220 xsltProcessor
.Load (new XmlTextReader (new StringReader (
1221 string.Format (xsltFragment
, "indent=\"yes\""))),
1222 new XmlUrlResolver (), AppDomain
.CurrentDomain
.Evidence
);
1223 xsltProcessor
.Transform (xmlDoc
, xsltArgs
, sw
, new XmlUrlResolver ());
1225 Assert
.AreEqual (string.Format (CultureInfo
.InvariantCulture
,
1230 " <p>something</p>{0}" +
1240 "</html>", end_of_line
), sw
.ToString (), "#1");
1243 sw
.GetStringBuilder ().Length
= 0;
1244 xsltProcessor
.Load (new XmlTextReader (new StringReader (
1245 string.Format (xsltFragment
, "indent=\"no\""))),
1246 new XmlUrlResolver (), AppDomain
.CurrentDomain
.Evidence
);
1247 xsltProcessor
.Transform (xmlDoc
, xsltArgs
, sw
, new XmlUrlResolver ());
1249 Assert
.AreEqual (string.Format (CultureInfo
.InvariantCulture
,
1250 "<html><body><p></p><p>something</p><p><div></div></p>" +
1251 "<p><whatever></whatever></p></body></html>",
1252 Environment
.NewLine
), sw
.ToString (), "#2");
1255 sw
.GetStringBuilder ().Length
= 0;
1256 xsltProcessor
.Load (new XmlTextReader (new StringReader (
1257 string.Format (xsltFragment
, ""))),
1258 new XmlUrlResolver (), AppDomain
.CurrentDomain
.Evidence
);
1259 xsltProcessor
.Transform (xmlDoc
, xsltArgs
, sw
, new XmlUrlResolver ());
1261 Assert
.AreEqual (string.Format (CultureInfo
.InvariantCulture
,
1266 " <p>something</p>{0}" +
1276 "</html>", end_of_line
), sw
.ToString (), "#3");
1280 [ExpectedException (typeof (XsltCompileException
))]
1281 public void Output_Indent_Invalid ()
1283 string xsltFragment
= @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
1284 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
1285 <xsl:output indent=""Yes"" />
1287 XslTransform xsltProcessor
= new XslTransform ();
1288 xsltProcessor
.Load (new XmlTextReader (new StringReader (xsltFragment
)),
1289 new XmlUrlResolver (), AppDomain
.CurrentDomain
.Evidence
);
1293 [ExpectedException (typeof (XsltCompileException
))]
1294 public void Output_Indent_Empty ()
1296 string xsltFragment
= @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
1297 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
1298 <xsl:output indent="""" />
1300 XslTransform xsltProcessor
= new XslTransform ();
1301 xsltProcessor
.Load (new XmlTextReader (new StringReader (xsltFragment
)),
1302 new XmlUrlResolver (), AppDomain
.CurrentDomain
.Evidence
);
1306 public void Output_Indent_ForwardsCompatible ()
1308 StringWriter sw
= new StringWriter ();
1309 XsltArgumentList xsltArgs
= new XsltArgumentList ();
1310 XslTransform xsltProcessor
= new XslTransform ();
1311 XmlDocument xmlDoc
= new XmlDocument ();
1312 xmlDoc
.LoadXml ("<dummy />");
1314 string xsltFragment
= @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
1315 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.5"">
1316 <xsl:output indent=""{0}"" />
1317 <xsl:template match=""/"">
1323 xsltProcessor
.Load (new XmlTextReader (new StringReader (
1324 string.Format (xsltFragment
, "Yes"))),
1325 new XmlUrlResolver (), AppDomain
.CurrentDomain
.Evidence
);
1326 xsltProcessor
.Transform (xmlDoc
, xsltArgs
, sw
, new XmlUrlResolver ());
1329 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
1330 "<root />", sw
.ToString (), "#1");
1333 sw
.GetStringBuilder ().Length
= 0;
1334 xsltProcessor
.Load (new XmlTextReader (new StringReader (
1335 string.Format (xsltFragment
, ""))),
1336 new XmlUrlResolver (), AppDomain
.CurrentDomain
.Evidence
);
1337 xsltProcessor
.Transform (xmlDoc
, xsltArgs
, sw
, new XmlUrlResolver ());
1340 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
1341 "<root />", sw
.ToString (), "#2");
1345 public void Output_MediaType ()
1347 StringWriter sw
= null;
1348 XsltArgumentList xsltArgs
= new XsltArgumentList ();
1349 XslTransform xsltProcessor
= new XslTransform ();
1351 string xsltFragment
= @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
1352 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
1353 <xsl:output media-type=""whatever"" />
1354 <xsl:template match=""/"">
1359 XmlDocument xmlDoc
= new XmlDocument ();
1360 xmlDoc
.LoadXml ("<dummy />");
1362 sw
= new StringWriter ();
1363 xsltProcessor
.Load (new XmlTextReader (new StringReader (xsltFragment
)),
1364 new XmlUrlResolver (), AppDomain
.CurrentDomain
.Evidence
);
1365 xsltProcessor
.Transform (xmlDoc
, xsltArgs
, sw
, new XmlUrlResolver ());
1368 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
1369 "<root />", sw
.ToString ());
1373 public void Output_Encoding_TextWriter ()
1375 StringWriter sw
= null;
1376 XsltArgumentList xsltArgs
= new XsltArgumentList ();
1377 XslTransform xsltProcessor
= new XslTransform ();
1379 string xsltFragment
= @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
1380 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
1382 <xsl:template match=""/"">
1387 XmlDocument xmlDoc
= new XmlDocument ();
1388 xmlDoc
.LoadXml ("<dummy />");
1391 sw
= new StringWriter ();
1392 xsltProcessor
.Load (new XmlTextReader (new StringReader (
1393 string.Format (xsltFragment
, string.Empty
))),
1394 new XmlUrlResolver (), AppDomain
.CurrentDomain
.Evidence
);
1395 xsltProcessor
.Transform (xmlDoc
, xsltArgs
, sw
, new XmlUrlResolver ());
1398 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
1399 "<root />", sw
.ToString (), "#1");
1402 sw
.GetStringBuilder ().Length
= 0;
1403 xsltProcessor
.Load (new XmlTextReader (new StringReader (
1404 string.Format(xsltFragment
, "encoding=\"iso-8859-1\""))),
1405 new XmlUrlResolver (), AppDomain
.CurrentDomain
.Evidence
);
1406 xsltProcessor
.Transform (xmlDoc
, xsltArgs
, sw
, new XmlUrlResolver ());
1409 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
1410 "<root />", sw
.ToString (), "#1");
1413 sw
.GetStringBuilder ().Length
= 0;
1414 xsltProcessor
.Load (new XmlTextReader (new StringReader (
1415 string.Format (xsltFragment
, "encoding=\"doesnotexist\""))),
1416 new XmlUrlResolver (), AppDomain
.CurrentDomain
.Evidence
);
1417 xsltProcessor
.Transform (xmlDoc
, xsltArgs
, sw
, new XmlUrlResolver ());
1420 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
1421 "<root />", sw
.ToString (), "#2");
1424 sw
.GetStringBuilder ().Length
= 0;
1425 xsltProcessor
.Load (new XmlTextReader (new StringReader (
1426 string.Format (xsltFragment
, "encoding=\"\""))),
1427 new XmlUrlResolver (), AppDomain
.CurrentDomain
.Evidence
);
1428 xsltProcessor
.Transform (xmlDoc
, xsltArgs
, sw
, new XmlUrlResolver ());
1431 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
1432 "<root />", sw
.ToString (), "#3");
1436 public void Output_Encoding_Stream ()
1438 MemoryStream ms
= null;
1439 string result
= null;
1440 XsltArgumentList xsltArgs
= new XsltArgumentList ();
1441 XslTransform xsltProcessor
= new XslTransform ();
1443 string xsltFragment
= @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
1444 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
1446 <xsl:template match=""/"">
1451 XmlDocument xmlDoc
= new XmlDocument ();
1452 xmlDoc
.LoadXml ("<dummy />");
1455 ms
= new MemoryStream ();
1456 xsltProcessor
.Load (new XmlTextReader (new StringReader (
1457 string.Format (xsltFragment
, string.Empty
))),
1458 new XmlUrlResolver (), AppDomain
.CurrentDomain
.Evidence
);
1459 xsltProcessor
.Transform (xmlDoc
, xsltArgs
, ms
, new XmlUrlResolver ());
1461 using (StreamReader sr
= new StreamReader (ms
, true)) {
1462 result
= sr
.ReadToEnd ();
1466 "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
1467 "<root />", result
, "#1");
1470 ms
= new MemoryStream ();
1471 xsltProcessor
.Load (new XmlTextReader (new StringReader (
1472 string.Format (xsltFragment
, "encoding=\"iso-8859-1\""))),
1473 new XmlUrlResolver (), AppDomain
.CurrentDomain
.Evidence
);
1474 xsltProcessor
.Transform (xmlDoc
, xsltArgs
, ms
, new XmlUrlResolver ());
1476 using (StreamReader sr
= new StreamReader (ms
, true)) {
1477 result
= sr
.ReadToEnd ();
1481 "<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>" +
1482 "<root />", result
, "#2");
1485 ms
= new MemoryStream ();
1486 xsltProcessor
.Load (new XmlTextReader (new StringReader (
1487 string.Format (xsltFragment
, "encoding=\"doesnotexist\""))),
1488 new XmlUrlResolver (), AppDomain
.CurrentDomain
.Evidence
);
1489 xsltProcessor
.Transform (xmlDoc
, xsltArgs
, ms
, new XmlUrlResolver ());
1491 using (StreamReader sr
= new StreamReader (ms
, true)) {
1492 result
= sr
.ReadToEnd ();
1496 "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
1497 "<root />", result
, "#3");
1500 ms
= new MemoryStream ();
1501 xsltProcessor
.Load (new XmlTextReader (new StringReader (
1502 string.Format (xsltFragment
, "encoding=\"\""))),
1503 new XmlUrlResolver (), AppDomain
.CurrentDomain
.Evidence
);
1504 xsltProcessor
.Transform (xmlDoc
, xsltArgs
, ms
, new XmlUrlResolver ());
1506 using (StreamReader sr
= new StreamReader (ms
, true)) {
1507 result
= sr
.ReadToEnd ();
1511 "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
1512 "<root />", result
, "#4");
1516 public void Output_Version ()
1518 StringWriter sw
= null;
1519 XsltArgumentList xsltArgs
= new XsltArgumentList ();
1520 XslTransform xsltProcessor
= new XslTransform ();
1522 string xsltFragment
= @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
1523 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
1524 <xsl:output version=""{0}"" />
1525 <xsl:template match=""/"">
1530 XmlDocument xmlDoc
= new XmlDocument ();
1531 xmlDoc
.LoadXml ("<dummy />");
1534 sw
= new StringWriter ();
1535 xsltProcessor
.Load (new XmlTextReader (new StringReader (
1536 string.Format (xsltFragment
, "1.0"))),
1537 new XmlUrlResolver (), AppDomain
.CurrentDomain
.Evidence
);
1538 xsltProcessor
.Transform (xmlDoc
, xsltArgs
, sw
, new XmlUrlResolver ());
1541 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
1542 "<root />", sw
.ToString (), "#1");
1545 sw
.GetStringBuilder ().Length
= 0;
1546 xsltProcessor
.Load (new XmlTextReader (new StringReader (
1547 string.Format (xsltFragment
, "2.0"))),
1548 new XmlUrlResolver (), AppDomain
.CurrentDomain
.Evidence
);
1549 xsltProcessor
.Transform (xmlDoc
, xsltArgs
, sw
, new XmlUrlResolver ());
1552 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
1553 "<root />", sw
.ToString (), "#2");
1556 sw
.GetStringBuilder ().Length
= 0;
1557 xsltProcessor
.Load (new XmlTextReader (new StringReader (
1558 string.Format (xsltFragment
, "BLABLA"))),
1559 new XmlUrlResolver (), AppDomain
.CurrentDomain
.Evidence
);
1560 xsltProcessor
.Transform (xmlDoc
, xsltArgs
, sw
, new XmlUrlResolver ());
1563 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
1564 "<root />", sw
.ToString (), "#3");
1568 public void Output_Method_Html_TextWriter ()
1570 string options
= null;
1571 StringWriter sw
= null;
1572 XsltArgumentList xsltArgs
= new XsltArgumentList ();
1573 XslTransform xsltProcessor
= new XslTransform ();
1575 string xsltFragment
= @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
1576 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
1577 <xsl:output method=""html"" {0} />
1578 <xsl:template match=""/"">
1579 <xsl:element name=""html"">
1580 <xsl:element name=""head"">
1581 <xsl:element name=""title"">Output Test</xsl:element>
1583 <xsl:element name=""Body"">
1584 <xsl:element name=""BR"" />
1590 XmlDocument xmlDoc
= new XmlDocument ();
1591 xmlDoc
.LoadXml ("<dummy />");
1593 // indent not set, media-type not set
1594 sw
= new StringWriter ();
1595 xsltProcessor
.Load (new XmlTextReader (new StringReader (
1596 string.Format (xsltFragment
, string.Empty
))),
1597 new XmlUrlResolver (), AppDomain
.CurrentDomain
.Evidence
);
1598 xsltProcessor
.Transform (xmlDoc
, xsltArgs
, sw
, new XmlUrlResolver ());
1600 Assert
.AreEqual (string.Format(CultureInfo
.InvariantCulture
,
1603 "{1}{1}<META http-equiv=\"Content-Type\" content=\"text/html; charset=utf-16\">{0}" +
1604 "{1}{1}<title>Output Test</title>{0}" +
1609 "</html>", end_of_line
, " "), sw
.ToString (), "#1");
1611 // indent no, media-type not set
1612 options
= "indent=\"no\"";
1613 sw
.GetStringBuilder ().Length
= 0;
1614 xsltProcessor
.Load (new XmlTextReader (new StringReader (
1615 string.Format (xsltFragment
, options
))),
1616 new XmlUrlResolver (), AppDomain
.CurrentDomain
.Evidence
);
1617 xsltProcessor
.Transform (xmlDoc
, xsltArgs
, sw
, new XmlUrlResolver ());
1619 Assert
.AreEqual (string.Format (CultureInfo
.InvariantCulture
,
1622 "{1}{1}<META http-equiv=\"Content-Type\" content=\"text/html; charset=utf-16\">{0}" +
1623 "{1}{1}<title>Output Test</title>{0}" +
1628 "</html>", string.Empty
, string.Empty
), sw
.ToString (), "#2");
1630 // indent yes, media-type "bla", omit-xml-declaration "no"
1631 options
= "indent=\"yes\" media-type=\"bla\"" +
1632 " encoding=\"iso-8859-1\" omit-xml-declaration=\"no\"";
1633 sw
.GetStringBuilder ().Length
= 0;
1634 xsltProcessor
.Load (new XmlTextReader (new StringReader (
1635 string.Format (xsltFragment
, options
))),
1636 new XmlUrlResolver (), AppDomain
.CurrentDomain
.Evidence
);
1637 xsltProcessor
.Transform (xmlDoc
, xsltArgs
, sw
, new XmlUrlResolver ());
1639 Assert
.AreEqual (string.Format (CultureInfo
.InvariantCulture
,
1642 "{1}{1}<META http-equiv=\"Content-Type\" content=\"bla; charset=utf-16\">{0}" +
1643 "{1}{1}<title>Output Test</title>{0}" +
1648 "</html>", end_of_line
, " "), sw
.ToString (), "#3");
1652 public void Output_Method_Html_Stream ()
1654 string options
= null;
1655 MemoryStream ms
= null;
1656 string result
= null;
1657 XsltArgumentList xsltArgs
= new XsltArgumentList ();
1658 XslTransform xsltProcessor
= new XslTransform ();
1660 string xsltFragment
= @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
1661 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
1662 <xsl:output method=""html"" {0} />
1663 <xsl:template match=""/"">
1664 <xsl:element name=""html"">
1665 <xsl:element name=""head"">
1666 <xsl:element name=""title"">Output Test</xsl:element>
1668 <xsl:element name=""Body"">
1669 <xsl:element name=""BR"" />
1675 XmlDocument xmlDoc
= new XmlDocument ();
1676 xmlDoc
.LoadXml ("<dummy />");
1678 // indent not set, media-type not set
1679 ms
= new MemoryStream ();
1680 xsltProcessor
.Load (new XmlTextReader (new StringReader (
1681 string.Format (xsltFragment
, string.Empty
))),
1682 new XmlUrlResolver (), AppDomain
.CurrentDomain
.Evidence
);
1683 xsltProcessor
.Transform (xmlDoc
, xsltArgs
, ms
, new XmlUrlResolver ());
1685 using (StreamReader sr
= new StreamReader (ms
, true)) {
1686 result
= sr
.ReadToEnd ();
1689 Assert
.AreEqual (string.Format (CultureInfo
.InvariantCulture
,
1692 "{1}{1}<META http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">{0}" +
1693 "{1}{1}<title>Output Test</title>{0}" +
1698 "</html>", end_of_line
, " "), result
, "#1");
1700 // indent no, media-type not set
1701 options
= "indent=\"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=\"text/html; charset=utf-8\">{0}" +
1716 "{1}{1}<title>Output Test</title>{0}" +
1721 "</html>", string.Empty
, string.Empty
), result
, "#2");
1723 // indent yes, media-type "bla", omit-xml-declaration "no"
1724 options
= "indent=\"yes\" media-type=\"bla\"" +
1725 " encoding=\"iso-8859-1\" omit-xml-declaration=\"no\"";
1726 ms
= new MemoryStream ();
1727 xsltProcessor
.Load (new XmlTextReader (new StringReader (
1728 string.Format (xsltFragment
, options
))),
1729 new XmlUrlResolver (), AppDomain
.CurrentDomain
.Evidence
);
1730 xsltProcessor
.Transform (xmlDoc
, xsltArgs
, ms
, new XmlUrlResolver ());
1732 using (StreamReader sr
= new StreamReader (ms
, true)) {
1733 result
= sr
.ReadToEnd ();
1736 Assert
.AreEqual (string.Format (CultureInfo
.InvariantCulture
,
1739 "{1}{1}<META http-equiv=\"Content-Type\" content=\"bla; charset=iso-8859-1\">{0}" +
1740 "{1}{1}<title>Output Test</title>{0}" +
1745 "</html>", end_of_line
, " "), result
, "#3");
1749 [ExpectedException (typeof (XsltCompileException
))]
1750 public void Output_Unknown_Attribute ()
1752 string xsltFragment
= @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
1753 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
1754 <xsl:output whatever="""" />
1756 XslTransform xsltProcessor
= new XslTransform ();
1757 xsltProcessor
.Load (new XmlTextReader (new StringReader (xsltFragment
)),
1758 new XmlUrlResolver (), AppDomain
.CurrentDomain
.Evidence
);
1762 public void Output_Unknown_Attribute_ForwardsCompatible ()
1764 StringWriter sw
= new StringWriter ();
1765 XsltArgumentList xsltArgs
= new XsltArgumentList ();
1766 XslTransform xsltProcessor
= new XslTransform ();
1767 XmlDocument xmlDoc
= new XmlDocument ();
1768 xmlDoc
.LoadXml ("<dummy />");
1770 string xsltFragment
= @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
1771 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.5"">
1772 <xsl:output whatever="""" />
1773 <xsl:template match=""/"">
1778 xsltProcessor
.Load (new XmlTextReader (new StringReader (xsltFragment
)),
1779 new XmlUrlResolver (), AppDomain
.CurrentDomain
.Evidence
);
1780 xsltProcessor
.Transform (xmlDoc
, xsltArgs
, sw
, new XmlUrlResolver ());
1783 "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
1784 "<root />", sw
.ToString (), "#1");
1788 public void Output_Unknown_Attribute_NonDefaultNamespace ()
1790 string xsltFragment
= @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
1791 <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" xmlns:tst=""something"" version=""1.0"">
1792 <xsl:output tst:whatever="""" />
1794 XslTransform xsltProcessor
= new XslTransform ();
1795 xsltProcessor
.Load (new XmlTextReader (new StringReader (xsltFragment
)),
1796 new XmlUrlResolver (), AppDomain
.CurrentDomain
.Evidence
);
1799 // http://support.microsoft.com/kb/832757/en-us
1801 public void FormatNumber_KB_832757 ()
1803 string xsltFragment
= @"<?xml version=""1.0"" encoding=""UTF-8""?>
1804 <xsl:stylesheet version=""1.0"" xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"">
1805 <xsl:output method=""xml"" version=""1.0"" encoding=""UTF-8"" indent=""yes"" />
1806 <xsl:template match=""/"">
1808 <xsl:apply-templates />
1811 <xsl:template match=""number"">
1812 <tr><td><xsl:value-of select=""format-number(.,'#,##0;(#,##0)')""/></td></tr>
1816 XmlDocument xmlDoc
= new XmlDocument ();
1817 xmlDoc
.LoadXml ("<root><number>1000</number></root>");
1819 StringWriter sw
= new StringWriter ();
1820 XslTransform xsltProcessor
= new XslTransform ();
1821 xsltProcessor
.Load (new XmlTextReader (new StringReader (xsltFragment
)),
1822 new XmlUrlResolver (), AppDomain
.CurrentDomain
.Evidence
);
1823 xsltProcessor
.Transform (xmlDoc
, new XsltArgumentList (), sw
,
1824 new XmlUrlResolver ());
1826 Assert
.AreEqual (string.Format(CultureInfo
.InvariantCulture
,
1827 "<?xml version=\"1.0\" encoding=\"utf-16\"?>{0}" +
1830 " <td>1,000</td>{0}" +
1832 "</table>", end_of_line
), sw
.ToString ());
1835 // http://support.microsoft.com/kb/293469/en-us
1837 public void FormatNumber_KB_293469 ()
1839 string xsltFragment
= @"<?xml version=""1.0""?>
1840 <xsl:stylesheet version=""1.0"" xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"">
1841 <xsl:output method=""xml"" indent=""yes"" />
1842 <xsl:decimal-format name=""european"" decimal-separator="","" grouping-separator=""."" />
1843 <xsl:template match=""/"">
1844 <xsl:element name=""html"">
1845 <xsl:element name=""body"">
1846 <xsl:apply-templates select=""root/amount"" />
1850 <xsl:template match=""amount"">
1851 <xsl:value-of select=""format-number(., '###.###,00', 'european')""/>
1855 XmlDocument xmlDoc
= new XmlDocument ();
1856 xmlDoc
.LoadXml ("<root><amount currency='USD'>44442.7</amount></root>");
1858 StringWriter sw
= new StringWriter ();
1859 XslTransform xsltProcessor
= new XslTransform ();
1860 xsltProcessor
.Load (new XmlTextReader (new StringReader (xsltFragment
)),
1861 new XmlUrlResolver (), AppDomain
.CurrentDomain
.Evidence
);
1862 xsltProcessor
.Transform (xmlDoc
, new XsltArgumentList (), sw
,
1863 new XmlUrlResolver ());
1865 Assert
.AreEqual (string.Format (CultureInfo
.InvariantCulture
,
1866 "<?xml version=\"1.0\" encoding=\"utf-16\"?>{0}" +
1868 " <body>44.442,70</body>{0}" +
1869 "</html>", end_of_line
), sw
.ToString ());
1873 [Category ("NotDotNet")]
1874 // MS bug: the output must be well-formed XML general entity
1875 // (doctype must not appear after text nodes).
1876 public void DocTypeAfterText ()
1879 <xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
1880 <xsl:output doctype-system='system'/>
1881 <xsl:template match='/'>
1882 <xsl:text xml:space='preserve'> a </xsl:text>
1886 XslTransform t
= new XslTransform ();
1887 t
.Load (new XmlTextReader (xsl
, XmlNodeType
.Document
, null));
1888 XmlDocument doc
= new XmlDocument ();
1890 t
.Transform (new XPathDocument (
1891 new StringReader ("<root/>")),
1892 null, TextWriter
.Null
);
1893 Assert
.Fail ("should fail; doctype is not allowed after whitespace. See XSLT 1.0 section 16.1.");
1899 public void StripSpace ()
1913 XslTransform t
= new XslTransform ();
1914 t
.Load ("Test/XmlFiles/xsl/stripspace.xsl");
1915 XPathDocument d
= new XPathDocument (
1916 "Test/XmlFiles/xsl/stripspace.xml", XmlSpace
.Preserve
);
1917 StringWriter sw
= new StringWriter ();
1918 t
.Transform (d
, null, sw
);
1919 Assert
.AreEqual (result
, sw
.ToString ());
1923 public void CurrentInSelect ()
1925 XslTransform t
= new XslTransform ();
1926 t
.Load ("Test/XmlFiles/xsl/current-in-select.xsl");
1927 XPathDocument d
= new XPathDocument (
1928 "Test/XmlFiles/xsl/current-in-select.xml", XmlSpace
.Preserve
);
1929 StringWriter sw
= new StringWriter ();
1930 t
.Transform (d
, null, sw
);
1931 using (StreamReader sr
= File
.OpenText (
1932 "Test/XmlFiles/xsl/current-in-select.ref")) {
1933 string s
= sr
.ReadToEnd ();
1934 Assert
.AreEqual (s
, sw
.ToString ());
1939 public void CallTemplateSignificantWhitespace ()
1942 string xsl
= @"<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
1943 <xsl:template name='foo' xml:space='preserve'>
1944 <xsl:call-template name='bar'>
1945 <xsl:with-param name='hoge' select='hoge' />
1946 </xsl:call-template>
1949 <xsl:template name='bar'>
1952 XslTransform t
= new XslTransform ();
1953 t
.Load (new XmlTextReader (new StringReader (xsl
)));
1954 t
.Transform (new XPathDocument (new StringReader ("<dummy/>")), null, new XmlTextWriter (TextWriter
.Null
));
1958 public void Bug82493 ()
1960 XslTransform transformationObj
= new XslTransform ();
1961 transformationObj
.Load ("Test/XmlFiles/xsl/82493.xsl");
1962 XmlDocument doc
= new XmlDocument ();
1963 doc
.Load ("Test/XmlFiles/xsl/82493.xml");
1964 XslExtensionClass GetCalculation
= new XslExtensionClass ("a4");
1965 XsltArgumentList xslExtensionArgList
= new XsltArgumentList ();
1966 xslExtensionArgList
.AddExtensionObject ("urn:e", GetCalculation
);
1967 XmlTextWriter writer
= new XmlTextWriter (TextWriter
.Null
);
1968 transformationObj
.Transform (doc
, xslExtensionArgList
, writer
, null);
1973 public void BugNovell325482 ()
1975 XmlDocument doc
= new XmlDocument ();
1976 doc
.Load ("Test/XmlFiles/xsl/325482.xml");
1977 XslTransform xt
= new XslTransform ();
1978 xt
.Load ("Test/XmlFiles/xsl/325482.xsl");
1979 xt
.Transform (doc
, null, TextWriter
.Null
);
1982 public class XslExtensionClass
1984 private string paperType
= String
.Empty
;
1986 public XslExtensionClass (string paperType
)
1988 this.paperType
= paperType
;
1991 public int GetPageDimensions ()
1993 switch (this.paperType
) {
1999 throw new ArgumentException ("Unknown page size type: " + this.paperType
);
2004 [Test
] // bug #348786
2005 public void ValueOfContainsExternalElements ()
2008 <xsl:stylesheet version=""1.0"" xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"">
2009 <xsl:template match=""x"">
2011 <xsl:value-of select=""@bar"">
2012 <!-- enter comment here -->
2017 new XslTransform ().Load (new XmlTextReader (xsl
, XmlNodeType
.Document
, null));
2020 [Test
] // bug #349035
2021 public void CompareRTFAsStringNotNodeset ()
2023 XslTransform xslt
= new XslTransform ();
2024 xslt
.Load (new XmlTextReader (new StringReader (@"
2025 <xsl:stylesheet version=""1.0""
2026 xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"">
2027 <xsl:template name=""foo"">
2028 <xsl:param name=""bar""/>
2029 <xsl:if test=""$bar!=''"">
2030 <bar>bar is not empty:'<xsl:value-of select=""$bar""/>'</bar>
2032 <xsl:if test=""$bar=''"">
2033 <bar>bar is empty</bar>
2036 <xsl:template match=""zap"">
2037 <xsl:call-template name=""foo"">
2038 <xsl:with-param name=""bar"">
2039 <xsl:for-each select=""@bar"">
2040 <xsl:value-of select="".""/>
2043 </xsl:call-template>
2047 XPathDocument input
= new XPathDocument (new StringReader (
2053 StringWriter sw
= new StringWriter ();
2054 XmlTextWriter xtw
= new XmlTextWriter (sw
);
2055 xslt
.Transform (input
, null, xtw
);
2056 string expected
= "<bar>bar is not empty:'HaHa'</bar><bar>bar is empty</bar>";
2057 Assert
.AreEqual (expected
, sw
.ToString ());
2061 public void Bug349111 ()
2063 XslTransform xslt
= new XslTransform ();
2064 xslt
.Load (new XmlTextReader (new StringReader (@"
2065 <xsl:stylesheet version=""1.0"" xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"">
2066 <xsl:template match=""book"">
2067 <xsl:for-each select=""child::node()[position()]"">
2069 <xsl:value-of select="".""/>
2075 XPathDocument input
= new XPathDocument (new StringReader (@"
2077 <book> <title lang=""eng"">Harry Potter</title> <price>29.99</price> </book>
2080 StringWriter sw
= new StringWriter ();
2081 xslt
.Transform (input
, null, new XmlTextWriter (sw
));
2082 string expected
= "<yyy>Harry Potter</yyy><yyy>29.99</yyy>";
2083 Assert
.AreEqual (expected
, sw
.ToString ());
2087 public void Bug351939 ()
2089 XslTransform xslt
= new XslTransform ();
2090 xslt
.Load (new XmlTextReader (new StringReader (
2091 @"<xsl:stylesheet version=""1.0""
2092 xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"">
2093 <xsl:key name=""thekey"" match=""aa"" use=""''""/>
2094 <xsl:key name=""thekey"" match=""ab"" use=""''""/>
2095 <xsl:template match=""root"">
2097 <foo><xsl:value-of select=""key('thekey','')[1]""/></foo>
2098 <bar><xsl:value-of select=""key('thekey','')[2]""/></bar>
2099 <baz><xsl:value-of select=""key('thekey','')[3]""/></baz>
2100 <tem><xsl:value-of select=""key('thekey','')[4]""/></tem>
2103 </xsl:stylesheet>")));
2104 StringWriter sw
= new StringWriter ();
2105 xslt
.Transform (new XPathDocument (new StringReader (
2106 @"<?xml version=""1.0""?>
2116 </root>")), null, new XmlTextWriter (sw
));
2117 Assert
.AreEqual ("<x><foo>1</foo><bar>2</bar><baz>3</baz><tem>4</tem></x>", sw
.ToString ());
2121 public void CopyOfIXPathNavigable ()
2124 <xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'
2125 xmlns:foo='urn:Foo'>
2126 <xsl:template match='/'>
2127 <xsl:copy-of select='foo:MyCustomFunction()'/>
2133 <given-name age='10'>
2135 <nick-name>Freddy</nick-name>
2137 <family-name>Smith</family-name>
2140 <given-name age='10'>
2142 <nick-name>Bob</nick-name>
2144 <family-name>Smith</family-name>
2147 XslTransform t
= new XslTransform ();
2148 t
.Load (new XPathDocument (new StringReader (xsl
)));
2149 XsltArgumentList args
= new XsltArgumentList();
2150 args
.AddExtensionObject ("urn:Foo", new CopyOfIXPathNavigableClass ());
2151 StringWriter sw
= new StringWriter ();
2152 t
.Transform (new XPathDocument (new StringReader (xml
)), args
, new XmlTextWriter (sw
));
2153 Assert
.AreEqual ("<root><child0 /><child1 /></root>", sw
.ToString ());
2156 public class CopyOfIXPathNavigableClass
2158 public object MyCustomFunction ()
2160 XmlDocument doc
= new XmlDocument ();
2161 doc
.LoadXml ("<root><child0 /><child1 /></root>");
2162 return doc
.DocumentElement
;
2166 [Test
] // bug #316238
2167 public void ResolveVariableInXsltArgumentList ()
2169 ResolveVariableInXsltArgumentList ("Test/XmlFiles/xsl/316238-1.xsl");
2170 ResolveVariableInXsltArgumentList ("Test/XmlFiles/xsl/316238-2.xsl");
2173 void ResolveVariableInXsltArgumentList (string file
)
2175 XmlDocument doc
= new XmlDocument ();
2176 doc
.LoadXml ("<doc><element id=\"test\">this is a test</element></doc>");
2177 XslTransform transform
= new XslTransform ();
2178 transform
.Load (file
);
2179 //Stream outputStream = Console.OpenStandardOutput();
2180 XsltArgumentList xsltArgs
= new XsltArgumentList ();
2181 xsltArgs
.AddParam ("test", "", "test");
2182 xsltArgs
.AddParam ("doc", "", doc
.CreateNavigator().Select ("*"));
2183 transform
.Transform (new XmlDocument (), xsltArgs
, TextWriter
.Null
);
2186 [Test
] // bug #378239
2187 public void WhitespaceEntityInStylesheet ()
2189 string xslt
= @"<?xml version='1.0' encoding='UTF-8'?>
2190 <!DOCTYPE xsl:stylesheet [
2194 <xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'>
2195 <xsl:output method='text' omit-xml-declaration='yes'/>
2197 <xsl:template match='/'>
2198 <xsl:text>&nl;Hello&nl;World</xsl:text>
2201 string expected
= @"
2204 XslTransform t
= new XslTransform ();
2205 t
.Load (new XPathDocument (new StringReader (xslt
)));
2206 StringWriter sw
= new StringWriter ();
2207 t
.Transform (new XPathDocument (new StringReader ("<test/>")), null, sw
);
2208 Assert
.AreEqual (expected
, sw
.ToString ());
2211 [Test
] // bug #556619
2212 public void RejectCurrencySymbolAsNumber ()
2214 XslTransform xslt
= new XslTransform ();
2215 StringWriter sw
= new StringWriter ();
2217 @"<?xml version=""1.0""?>
2221 xmlns:xsl=""http://www.w3.org/1999/XSL/Transform""
2224 <xsl:template name=""F"">
2225 <xsl:param name=""p""/>
2227 <xsl:when test=""number($p)"">
2228 YES <xsl:value-of select=""number($p)""/>
2235 <xsl:template match=""/"">
2236 <xsl:call-template name=""F"">
2237 <xsl:with-param name=""p"">$4$2</xsl:with-param>
2238 </xsl:call-template>
2242 xslt
.Load (new XmlTextReader (new StringReader (s
)));
2243 xslt
.Transform (new XPathDocument (new StringReader (
2244 @"<?xml version=""1.0""?>
2246 </root>")), null, sw
);
2247 Assert
.IsTrue (sw
.ToString ().IndexOf ("NO") > 0);
2250 [Test
] // bug #349375
2251 public void PreserveWhitespace ()
2253 XslCompiledTransform xslt
= new XslCompiledTransform ();
2254 xslt
.Load (new XmlTextReader (new StringReader (@"
2257 xmlns:xsl=""http://www.w3.org/1999/XSL/Transform""
2259 <xsl:output omit-xml-declaration='yes' />
2260 <xsl:strip-space elements='*'/>
2261 <xsl:preserve-space elements='p span'/>
2263 <xsl:template name='foo'>
2264 <xsl:for-each select='node()'>
2265 <xsl:attribute name='yes-one-node'/>
2266 <xsl:value-of select='.'/>
2268 <xsl:if test='not(node())'>
2269 <xsl:attribute name='not-node'/>
2270 <xsl:value-of select='.'/>
2274 <xsl:template match='p'>
2276 <xsl:for-each select='child::node()[position()]'>
2278 <xsl:when test='name()=""span""'>
2280 <xsl:call-template name='foo'/>
2288 </xsl:stylesheet>")));
2289 StringWriter sw
= new StringWriter ();
2290 xslt
.Transform (new XmlTextReader (new StringReader (@"
2298 </root>")), null, sw
);
2299 Assert
.AreEqual (@"<y><t yes-one-node="""">1</t><t yes-one-node=""""> </t></y>", sw
.ToString ());
2302 [Test
] // reverse case of #349375
2303 // [Category ("NotDotNet")]
2304 public void PreserveWhitespace2 ()
2306 XslCompiledTransform xslt
= new XslCompiledTransform ();
2307 xslt
.Load (new XmlTextReader (new StringReader (@"
2310 xmlns:xsl=""http://www.w3.org/1999/XSL/Transform""
2312 <xsl:output omit-xml-declaration='yes' />
2313 <xsl:preserve-space elements='*'/>
2314 <xsl:strip-space elements='p span'/>
2316 <xsl:template name='foo'>
2317 <xsl:for-each select='node()'>
2318 <xsl:attribute name='yes-one-node'/>
2319 <xsl:value-of select='.'/>
2321 <xsl:if test='not(node())'>
2322 <xsl:attribute name='not-node'/>
2323 <xsl:value-of select='.'/>
2327 <xsl:template match='p'>
2329 <xsl:for-each select='child::node()[position()]'>
2331 <xsl:when test='name()=""span""'>
2333 <xsl:call-template name='foo'/>
2341 </xsl:stylesheet>")));
2342 StringWriter sw
= new StringWriter ();
2343 xslt
.Transform (new XmlTextReader (new StringReader (@"
2351 </root>")), null, sw
);
2352 // Assert.AreEqual (@"<y><t yes-one-node="""">1</t><t not-node=""""></t></y>", sw.ToString ());
2353 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 ());
2357 public void CompiledTransform_Fragment () // bug #391424
2359 XslCompiledTransform xslTransform
= new XslCompiledTransform ();
2360 XsltSettings settings
= new XsltSettings ();
2361 settings
.EnableDocumentFunction
= true;
2362 xslTransform
.Load ("Test/XmlFiles/xsl/391424.xsl", settings
, new XmlUrlResolver ());
2363 StringWriter sw
= new StringWriter ();
2364 xslTransform
.Transform (new XPathDocument ("Test/XmlFiles/xsl/391424.xml", XmlSpace
.Preserve
), null, sw
);
2365 Assert
.AreEqual ("<?xml version=\"1.0\" encoding=\"utf-16\"?>Document found", sw
.ToString ());
2369 public void XslTextElement_PreservesWhitespace () // bug 450797
2371 XslCompiledTransform xslt
= new XslCompiledTransform ();
2372 xslt
.Load (new XmlTextReader (new StringReader (@"
2374 xmlns:xsl=""http://www.w3.org/1999/XSL/Transform""
2376 <xsl:output method='text' omit-xml-declaration='yes'/>
2377 <xsl:template match='foo'>
2378 <xsl:text> </xsl:text>
2380 </xsl:stylesheet>")));
2381 StringWriter sw
= new StringWriter ();
2382 xslt
.Transform (new XmlTextReader (new StringReader (@"<foo>bar</foo>")), null, sw
);
2383 Assert
.AreEqual (" ", sw
.ToString ());
2387 public void Bug487065 ()
2389 using (XmlReader input
= GetInput ()) {
2390 using (XmlWriter output
= XmlWriter
.Create (Path
.Combine(Path
.GetTempPath(), "out.xml"))) {
2391 PreProcess (input
, output
);
2392 Assert
.IsTrue (valueHasBeenSet
, "#1");
2397 private static XmlReader
GetInput ()
2399 return XmlReader
.Create (new StringReader ("<cb:config-template xmlns:cb=\"urn:ccnet.config.builder\"><cb:define name=\"var1\">value1</cb:define></cb:config-template>"));
2402 private void PreProcess (XmlReader input
, XmlWriter output
)
2404 var xsltsettings
= new XsltSettings (true, true);
2405 var xsltpreprocess
= new XslCompiledTransform (true);
2408 new StringReader (@"
2409 <xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'
2410 xmlns:msxsl='urn:schemas-microsoft-com:xslt'
2411 xmlns:cb='urn:ccnet.config.builder'
2412 xmlns:env='environment'
2413 xmlns:exsl='http://exslt.org/common'
2414 exclude-result-prefixes='msxsl cb env exsl'>
2415 <xsl:template match='cb:define[not(*) and @name]'>
2416 <xsl:for-each select='env:define_text_constant(@name,.)'/>
2418 </xsl:stylesheet>");
2420 using (XmlReader xsltreader
= XmlReader
.Create (stream
))
2421 xsltpreprocess
.Load (xsltreader
, xsltsettings
, new XmlUrlResolver());
2423 var xsltargs
= new XsltArgumentList ();
2425 // The XSLT calls extension functions in _current_env.
2426 xsltargs
.AddExtensionObject ("environment", this);
2427 xsltpreprocess
.Transform (input
, xsltargs
, output
, null);
2430 public void define_text_constant (string name
, string value)
2432 Assert
.AreEqual("var1", name
, "#a1");
2433 Assert
.AreEqual("value1", value, "#a2");
2434 valueHasBeenSet
= true;
2437 private bool valueHasBeenSet
;
2440 public void IncludeProcessStylesheet ()
2442 string includedXsl
= @"<?xml version='1.0' ?>
2443 <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'>
2444 <doc:template name='foo' />
2445 <xsl:template name='foo'>
2449 string file
= Path
.Combine (Path
.GetTempPath (), "include.xsl");
2450 StreamWriter includedWriter
= new StreamWriter (file
);
2451 includedWriter
.WriteLine (includedXsl
);
2452 includedWriter
.Close ();
2453 XslCompiledTransform transform
= new XslCompiledTransform ();
2454 string xsl
= @"<?xml version='1.0' ?>
2455 <xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'>
2456 <xsl:include href='include.xsl' />
2457 <xsl:template match='/'>
2458 <xsl:call-template name='foo' />
2460 </xsl:stylesheet>".Replace ("include.xsl", file
);
2461 XmlReader xslReader
= XmlReader
.Create (new StringReader (xsl
));
2462 transform
.Load (xslReader
);
2463 XmlReader inputReader
= XmlReader
.Create (new StringReader ("<bar />"));
2464 var sw
= new StringWriter ();
2465 XmlWriter outputWriter
= XmlWriter
.Create (sw
);
2466 transform
.Transform (inputReader
, outputWriter
);
2467 outputWriter
.Close ();
2468 Assert
.AreEqual ("<?xml version=\"1.0\" encoding=\"utf-16\"?><foo />", sw
.ToString (), "#1");