XslTransformTests.cs 61 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749
  1. //
  2. // System.Xml.Xsl.XslTransformTests.cs
  3. //
  4. // Author:
  5. // Atsushi Enomoto <[email protected]>
  6. //
  7. // (C) 2002 Atsushi Enomoto
  8. //
  9. using System;
  10. using System.Globalization;
  11. using System.IO;
  12. using System.Text;
  13. using System.Xml;
  14. using System.Xml.XPath;
  15. using System.Xml.Xsl;
  16. using NUnit.Framework;
  17. namespace MonoTests.System.Xml.Xsl
  18. {
  19. [TestFixture]
  20. public class XslTransformTests
  21. {
  22. XmlDocument doc;
  23. XslTransform xslt;
  24. XmlDocument result;
  25. [SetUp]
  26. public void GetReady()
  27. {
  28. doc = new XmlDocument ();
  29. xslt = new XslTransform ();
  30. result = new XmlDocument ();
  31. }
  32. [Test]
  33. public void TestBasicTransform ()
  34. {
  35. doc.LoadXml ("<root/>");
  36. xslt.Load ("Test/XmlFiles/xsl/empty.xsl");
  37. xslt.Transform ("Test/XmlFiles/xsl/empty.xsl", "Test/XmlFiles/xsl/result.xml");
  38. result.Load ("Test/XmlFiles/xsl/result.xml");
  39. Assert.AreEqual (2, result.ChildNodes.Count, "count");
  40. }
  41. [Test]
  42. [ExpectedException (typeof (XsltCompileException))]
  43. public void InvalidStylesheet ()
  44. {
  45. XmlDocument doc = new XmlDocument ();
  46. doc.LoadXml ("<xsl:element xmlns:xsl='http://www.w3.org/1999/XSL/Transform' />");
  47. XslTransform t = new XslTransform ();
  48. t.Load (doc);
  49. }
  50. [Test]
  51. [ExpectedException (typeof (XsltCompileException))]
  52. public void EmptyStylesheet ()
  53. {
  54. XmlDocument doc = new XmlDocument ();
  55. XslTransform t = new XslTransform ();
  56. t.Load (doc);
  57. }
  58. [Test]
  59. [ExpectedException (typeof (XsltCompileException))]
  60. public void InvalidStylesheet2 ()
  61. {
  62. string xsl = @"<xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'>
  63. <xsl:template match='/root'>
  64. <xsl:call-template name='foo'>
  65. <xsl:with-param name='name' value='text()' />
  66. </xsl:call-template>
  67. </xsl:template>
  68. <xsl:template name='foo'>
  69. <xsl:param name='name' />
  70. <result>
  71. <xsl:if test='1'>
  72. <xsl:variable name='last' value='text()' />
  73. <xsl:value-of select='$last' />
  74. </xsl:if>
  75. </result>
  76. </xsl:template>
  77. </xsl:stylesheet>
  78. ";
  79. XslTransform xslt = new XslTransform ();
  80. xslt.Load (new XPathDocument (new XmlTextReader (xsl, XmlNodeType.Document, null)));
  81. }
  82. [Test()]
  83. [Category ("NotWorking")] // it depends on "mcs" existence
  84. public void MsxslTest() {
  85. string _styleSheet = @"
  86. <xslt:stylesheet xmlns:xslt=""http://www.w3.org/1999/XSL/Transform"" version=""1.0""
  87. xmlns:msxsl=""urn:schemas-microsoft-com:xslt"" xmlns:stringutils=""urn:schemas-sourceforge.net-blah"">
  88. <xslt:output method=""text"" />
  89. <msxsl:script language=""C#"" implements-prefix=""stringutils"">
  90. <![CDATA[
  91. string PadRight( string str, int padding) {
  92. return str.PadRight(padding);
  93. }
  94. ]]>
  95. </msxsl:script>
  96. <xslt:template match=""test"">
  97. <xslt:value-of select=""stringutils:PadRight(@name, 20)"" />
  98. </xslt:template>
  99. </xslt:stylesheet>";
  100. StringReader stringReader = new StringReader(_styleSheet);
  101. XslTransform transform = new XslTransform();
  102. XmlTextReader reader = new XmlTextReader(stringReader);
  103. transform.Load(reader, new XmlUrlResolver(), AppDomain.CurrentDomain.Evidence);
  104. StringBuilder sb = new StringBuilder();
  105. StringWriter writer = new StringWriter(sb, CultureInfo.InvariantCulture);
  106. XsltArgumentList arguments = new XsltArgumentList();
  107. XmlDocument xmlDoc = new XmlDocument();
  108. xmlDoc.LoadXml("<test name=\"test\" />");
  109. // Do transformation
  110. transform.Transform(xmlDoc, new XsltArgumentList(), writer, new XmlUrlResolver());
  111. Assert.AreEqual ("test".PadRight(20), sb.ToString());
  112. }
  113. [Test]
  114. public void MSXslNodeSet ()
  115. {
  116. string xsl = @"<xsl:stylesheet version='1.0'
  117. xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns:msxsl='urn:schemas-microsoft-com:xslt'>
  118. <xsl:template match='/'>
  119. <root>
  120. <xsl:variable name='var'>
  121. <xsl:copy-of select='root/foo' />
  122. </xsl:variable>
  123. <xsl:for-each select='msxsl:node-set($var)/foo'>
  124. <xsl:value-of select='name(.)' />: <xsl:value-of select='@attr' />
  125. </xsl:for-each>
  126. </root>
  127. </xsl:template>
  128. </xsl:stylesheet>";
  129. StringWriter sw = new StringWriter ();
  130. XslTransform t = new XslTransform ();
  131. t.Load (new XPathDocument (new StringReader (xsl)));
  132. t.Transform (new XPathDocument (new XmlTextReader (new StringReader ("<root><foo attr='A'/><foo attr='B'/><foo attr='C'/></root>"))), null, sw);
  133. Assert.AreEqual (@"<?xml version=""1.0"" encoding=""utf-16""?><root xmlns:msxsl=""urn:schemas-microsoft-com:xslt"">foo: Afoo: Bfoo: C</root>", sw.ToString ());
  134. }
  135. [Test]
  136. [Category ("NotDotNet")]
  137. // Actually MS.NET here throws XsltException, but Mono returns
  138. // XPathException (since XPath evaluation engine generally
  139. // catches (should catch) static error. It is implementation
  140. // dependent matter.
  141. [ExpectedException (typeof (XPathException))]
  142. public void MSXslNodeSetRejectsNodeSet ()
  143. {
  144. string xsl = @"<xsl:stylesheet version='1.0'
  145. xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns:msxsl='urn:schemas-microsoft-com:xslt'>
  146. <xsl:template match='/'>
  147. <root>
  148. <!-- msxsl:node-set() does not accept a node set -->
  149. <xsl:for-each select='msxsl:node-set(root/foo)'>
  150. <xsl:value-of select='name(.)' />: <xsl:value-of select='@attr' />
  151. </xsl:for-each>
  152. </root>
  153. </xsl:template>
  154. </xsl:stylesheet>";
  155. StringWriter sw = new StringWriter ();
  156. XslTransform t = new XslTransform ();
  157. t.Load (new XPathDocument (new StringReader (xsl)));
  158. t.Transform (new XPathDocument (new XmlTextReader (new StringReader ("<root><foo attr='A'/><foo attr='B'/><foo attr='C'/></root>"))), null, sw);
  159. }
  160. [Test]
  161. public void EvaluateEmptyVariableAsBoolean ()
  162. {
  163. string xsl = @"<xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'>
  164. <xsl:template match='/'>
  165. <xsl:variable name='var'><empty /></xsl:variable>
  166. <root><xsl:if test='$var'>true</xsl:if></root>
  167. </xsl:template>
  168. </xsl:stylesheet>";
  169. XslTransform t = new XslTransform ();
  170. t.Load (new XPathDocument (new StringReader (xsl)));
  171. StringWriter sw = new StringWriter ();
  172. t.Transform (
  173. new XPathDocument (new StringReader ("<root/>")),
  174. null,
  175. sw);
  176. Assert.IsTrue (sw.ToString ().IndexOf ("true") > 0);
  177. }
  178. [Test]
  179. [ExpectedException (typeof (XsltCompileException))]
  180. public void NotAllowedPatternAxis ()
  181. {
  182. string xsl = @"<xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'>
  183. <xsl:template match='/descendant-or-self::node()/elem'>
  184. <ERROR/>
  185. </xsl:template>
  186. </xsl:stylesheet>";
  187. new XslTransform ().Load (new XPathDocument (
  188. new StringReader (xsl)));
  189. }
  190. [Test]
  191. [ExpectedException (typeof (XsltCompileException))]
  192. public void ImportIncorrectlyLocated ()
  193. {
  194. string xsl = @"<xsl:transform xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'>
  195. <xsl:template match='/'></xsl:template>
  196. <xsl:import href='dummy.xsl' />
  197. </xsl:transform>";
  198. new XslTransform ().Load (new XPathDocument (
  199. new StringReader (xsl)));
  200. }
  201. private WeakReference StylesheetLoad (XslTransform t, string xsl)
  202. {
  203. XPathDocument doc = new XPathDocument (
  204. new StringReader (xsl));
  205. WeakReference wr = new WeakReference (doc);
  206. t.Load (doc);
  207. return wr;
  208. }
  209. private WeakReference StylesheetTransform (XslTransform t, string xml)
  210. {
  211. XPathDocument doc = new XPathDocument (
  212. new StringReader (xml));
  213. WeakReference wr = new WeakReference (doc);
  214. t.Transform (doc, null, TextWriter.Null, null);
  215. return wr;
  216. }
  217. [Test]
  218. // bug #75663.
  219. public void ErrorOnDocumentResolution ()
  220. {
  221. // XslTransform recovers from errors on document resolution.
  222. string xslText = @"<xsl:stylesheet
  223. xmlns:xsl='http://www.w3.org/1999/XSL/Transform'
  224. version='1.0'>
  225. <xsl:variable name='n'
  226. select='document(""notexist.xml"")' />
  227. <xsl:template match='/'>xx</xsl:template>
  228. </xsl:stylesheet>";
  229. string xmlText = @"<root />";
  230. XslTransform transform = new XslTransform ();
  231. XPathDocument doc = new XPathDocument (
  232. new XmlTextReader ("a.xsl", new StringReader (xslText)));
  233. transform.Load (doc);
  234. XPathDocument xmlDocument = new XPathDocument (new StringReader (xmlText));
  235. StringWriter sw = new StringWriter ();
  236. transform.Transform (xmlDocument, null, sw);
  237. Assert.AreEqual (
  238. "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
  239. "xx", sw.ToString ());
  240. }
  241. // bug #76046
  242. [Test]
  243. public void LoadStyleFromNonRoot ()
  244. {
  245. XmlDocument doc = new XmlDocument ();
  246. XslTransform xslt = new XslTransform ();
  247. doc.LoadXml ("<root><dummy /><xsl:transform xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0' /></root>");
  248. XmlNode node = doc.ChildNodes [0].ChildNodes [1];
  249. xslt.Load (node, null, null);
  250. }
  251. [Test]
  252. public void ReturnEmptyResultsAsXmlReader ()
  253. {
  254. // bug #76115
  255. XmlDocument doc = new XmlDocument ();
  256. doc.LoadXml ("<xsl:transform xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0' />");
  257. XslTransform xslt = new XslTransform ();
  258. xslt.Load (doc, null, null);
  259. XmlReader reader = xslt.Transform(doc, null, new XmlUrlResolver ());
  260. reader.Read ();
  261. // another case - with xsl:output standalone='yes'
  262. 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>");
  263. xslt = new XslTransform ();
  264. xslt.Load (doc, null, null);
  265. reader = xslt.Transform (doc, null, new XmlUrlResolver ());
  266. while (!reader.EOF)
  267. reader.Read (); // btw no XMLdecl output.
  268. }
  269. [Test] // bug #76530
  270. // http://www.w3.org/TR/xslt#section-Creating-Elements-with-xsl:element
  271. // "If the namespace attribute is not present then the QName
  272. // is expanded into an expanded-name using the namespace
  273. // declarations in effect for the xsl:element element,
  274. // including any default namespace declaration."
  275. public void LREDefaultNamespace ()
  276. {
  277. string xsl = @"<xsl:stylesheet version='1.0' xmlns='urn:foo' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
  278. <xsl:template match='/*'>
  279. <xsl:element name='{local-name()}' />
  280. </xsl:template>
  281. </xsl:stylesheet>";
  282. string xml = "<root/>";
  283. XslTransform t = new XslTransform ();
  284. t.Load (new XPathDocument (new StringReader (xsl)));
  285. StringWriter sw = new StringWriter ();
  286. XmlTextWriter xw = new XmlTextWriter (sw);
  287. t.Transform (
  288. new XPathDocument (new StringReader (xml)),
  289. null, xw);
  290. Assert.AreEqual ("<root xmlns=\"urn:foo\" />",
  291. sw.ToString ());
  292. string xsl2 = @"<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns='urn:foo'>
  293. <xsl:template match='/*'>
  294. <root>
  295. <xsl:element name='{local-name()}' />
  296. </root>
  297. </xsl:template>
  298. </xsl:stylesheet>";
  299. string xml2 = "<page/>";
  300. t.Load (new XPathDocument (new StringReader (xsl2)));
  301. sw = new StringWriter ();
  302. xw = new XmlTextWriter (sw);
  303. t.Transform (
  304. new XPathDocument (new StringReader (xml2)),
  305. null, xw);
  306. Assert.AreEqual ("<root xmlns=\"urn:foo\"><page /></root>",
  307. sw.ToString ());
  308. }
  309. [Test]
  310. // http://lists.ximian.com/pipermail/mono-devel-list/2005-November/015812.html
  311. public void WhitespaceHandling ()
  312. {
  313. string ref_out = @"XML
  314. Extensible Markup language
  315. Great stuffs
  316. XSLT
  317. Extensible Markup language
  318. Great stuffs
  319. XPATH
  320. Extensible Markup language
  321. Great stuffs
  322. XSD
  323. Extensible Markup language
  324. Great stuffs
  325. ";
  326. XmlDocument d = new XmlDocument ();
  327. d.Load ("Test/XmlFiles/xsl/91834.xml");
  328. XslTransform t = new XslTransform ();
  329. t.Load ("Test/XmlFiles/xsl/91834.xsl");
  330. StringWriter sw_raw = new StringWriter ();
  331. t.Transform (d, null, sw_raw);
  332. Assert.AreEqual (ref_out, sw_raw.ToString ().Replace ("\r\n", "\n"));
  333. }
  334. // http://support.microsoft.com/default.aspx?scid=kb;en-us;829014
  335. [Test]
  336. public void EmptyNodeSetSort ()
  337. {
  338. string xmlFragment = @"<?xml version=""1.0"" encoding=""utf-8""?>
  339. <EMPLOYEES>
  340. <EMPLOYEE>
  341. <NAME>Steve</NAME>
  342. <DEPT>IT</DEPT>
  343. <SKILL>C++</SKILL>
  344. <SKILL>C#</SKILL>
  345. </EMPLOYEE>
  346. <EMPLOYEE>
  347. <NAME>John</NAME>
  348. <DEPT>IT</DEPT>
  349. <SKILL>VB.NET</SKILL>
  350. <SKILL>SQl Server</SKILL>
  351. </EMPLOYEE>
  352. </EMPLOYEES>";
  353. string xsltFragment = @"<?xml version=""1.0""?>
  354. <xsl:stylesheet version=""1.0"" xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"">
  355. <xsl:output omit-xml-declaration=""yes"" />
  356. <xsl:preserve-space elements=""*"" />
  357. <xsl:template match=""/EMPLOYEES"">
  358. <xsl:for-each select=""EMPLOYEE[DEPT='Finance']"">
  359. <xsl:sort select=""NAME""/>
  360. <xsl:value-of select=""NAME""/>
  361. </xsl:for-each>
  362. </xsl:template>
  363. </xsl:stylesheet>";
  364. XmlTextReader xmlRdr = new XmlTextReader (new StringReader (xmlFragment));
  365. XmlTextReader xsltRdr = new XmlTextReader (new StringReader (xsltFragment));
  366. XslTransform stylesheet = new XslTransform ();
  367. stylesheet.Load (xsltRdr, new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  368. StringWriter sw = new StringWriter ();
  369. stylesheet.Transform (new XPathDocument (xmlRdr), new XsltArgumentList (),
  370. sw, new XmlUrlResolver ());
  371. Assert.AreEqual (0, sw.ToString ().Length);
  372. }
  373. // http://support.microsoft.com/default.aspx?scid=kb;en-us;834667
  374. [Test]
  375. #if NET_1_1
  376. [Category ("NotDotNet")]
  377. #endif
  378. public void LocalParameter ()
  379. {
  380. string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
  381. <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
  382. <xsl:param name=""param1"" select=""'global-param1-default'"" />
  383. <xsl:param name=""param2"" select=""'global-param2-default'"" />
  384. <xsl:output method=""text"" encoding=""ascii"" />
  385. <xsl:template match=""/"">
  386. <xsl:call-template name=""Test"">
  387. <xsl:with-param name=""param1"" select=""'local-param1-arg'"" />
  388. <xsl:with-param name=""param2"" select=""'local-param2-arg'"" />
  389. </xsl:call-template>
  390. </xsl:template>
  391. <xsl:template name=""Test"">
  392. <xsl:param name=""param1"" select=""'local-param1-default'"" />
  393. <xsl:param name=""param2"" select=""'local-param2-default'"" />
  394. <xsl:value-of select=""$param1"" /><xsl:text>/</xsl:text><xsl:value-of select=""$param2"" />
  395. </xsl:template>
  396. </xsl:stylesheet>";
  397. XmlDocument xmlDoc = new XmlDocument ();
  398. xmlDoc.LoadXml ("<dummy />");
  399. XslTransform xsltProcessor = new XslTransform ();
  400. xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
  401. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  402. StringWriter sw = new StringWriter ();
  403. XsltArgumentList xsltArgs = new XsltArgumentList ();
  404. xsltArgs.AddParam ("param1", string.Empty, "global-param1-arg");
  405. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  406. Assert.AreEqual ("local-param1-arg/local-param2-arg", sw.ToString ());
  407. }
  408. [Test]
  409. public void Output_Standalone ()
  410. {
  411. StringWriter sw = null;
  412. XsltArgumentList xsltArgs = new XsltArgumentList ();
  413. XslTransform xsltProcessor = new XslTransform ();
  414. string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
  415. <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
  416. <xsl:output {0} />
  417. <xsl:template match=""/"">
  418. <root />
  419. </xsl:template>
  420. </xsl:stylesheet>";
  421. XmlDocument xmlDoc = new XmlDocument ();
  422. xmlDoc.LoadXml ("<dummy />");
  423. sw = new StringWriter ();
  424. xsltProcessor.Load (new XmlTextReader (new StringReader (
  425. string.Format(xsltFragment, "standalone=\"yes\""))),
  426. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  427. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  428. Assert.AreEqual (
  429. "<?xml version=\"1.0\" encoding=\"utf-16\"" +
  430. " standalone=\"yes\"?><root />", sw.ToString (), "#1");
  431. sw = new StringWriter ();
  432. xsltProcessor.Load (new XmlTextReader (new StringReader (
  433. string.Format (xsltFragment, "standalone=\"no\""))),
  434. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  435. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  436. Assert.AreEqual (
  437. "<?xml version=\"1.0\" encoding=\"utf-16\"" +
  438. " standalone=\"no\"?><root />", sw.ToString (), "#2");
  439. sw = new StringWriter ();
  440. xsltProcessor.Load (new XmlTextReader (new StringReader (
  441. string.Format (xsltFragment, ""))),
  442. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  443. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  444. Assert.AreEqual (
  445. "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
  446. "<root />", sw.ToString (), "#3");
  447. }
  448. [Test]
  449. [ExpectedException (typeof (XsltCompileException))]
  450. public void Output_Standalone_Invalid ()
  451. {
  452. string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
  453. <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
  454. <xsl:output standalone=""Yes"" />
  455. </xsl:stylesheet>";
  456. XslTransform xsltProcessor = new XslTransform ();
  457. xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
  458. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  459. }
  460. [Test]
  461. public void Output_Standalone_ForwardsCompatible ()
  462. {
  463. StringWriter sw = new StringWriter ();
  464. XsltArgumentList xsltArgs = new XsltArgumentList ();
  465. XslTransform xsltProcessor = new XslTransform ();
  466. XmlDocument xmlDoc = new XmlDocument ();
  467. xmlDoc.LoadXml ("<dummy />");
  468. string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
  469. <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.5"">
  470. <xsl:output standalone=""{0}"" />
  471. <xsl:template match=""/"">
  472. <root />
  473. </xsl:template>
  474. </xsl:stylesheet>";
  475. // standalone is "Yes"
  476. xsltProcessor.Load (new XmlTextReader (new StringReader (
  477. string.Format (xsltFragment, "Yes"))),
  478. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  479. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  480. Assert.AreEqual (
  481. "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
  482. "<root />", sw.ToString (), "#1");
  483. // standalone is empty
  484. sw.GetStringBuilder ().Length = 0;
  485. xsltProcessor.Load (new XmlTextReader (new StringReader (
  486. string.Format (xsltFragment, ""))),
  487. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  488. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  489. Assert.AreEqual (
  490. "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
  491. "<root />", sw.ToString (), "#2");
  492. }
  493. [Test]
  494. [ExpectedException (typeof (XsltCompileException))]
  495. public void Output_Standalone_Empty ()
  496. {
  497. string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
  498. <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
  499. <xsl:output standalone="""" />
  500. </xsl:stylesheet>";
  501. XslTransform xsltProcessor = new XslTransform ();
  502. xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
  503. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  504. }
  505. [Test]
  506. public void Output_OmitXmlDeclaration ()
  507. {
  508. StringWriter sw = null;
  509. XsltArgumentList xsltArgs = new XsltArgumentList ();
  510. XslTransform xsltProcessor = new XslTransform ();
  511. string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
  512. <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
  513. <xsl:output {0} />
  514. <xsl:template match=""/"">
  515. <root />
  516. </xsl:template>
  517. </xsl:stylesheet>";
  518. XmlDocument xmlDoc = new XmlDocument ();
  519. xmlDoc.LoadXml ("<dummy />");
  520. sw = new StringWriter ();
  521. xsltProcessor.Load (new XmlTextReader (new StringReader (
  522. string.Format (xsltFragment, "omit-xml-declaration=\"yes\""))),
  523. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  524. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  525. Assert.AreEqual ("<root />", sw.ToString (), "#1");
  526. sw.GetStringBuilder ().Length = 0;
  527. xsltProcessor.Load (new XmlTextReader (new StringReader (
  528. string.Format (xsltFragment, "omit-xml-declaration=\"no\""))),
  529. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  530. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  531. Assert.AreEqual (
  532. "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
  533. "<root />", sw.ToString (), "#2");
  534. }
  535. [Test]
  536. [ExpectedException (typeof (XsltCompileException))]
  537. public void Output_OmitXmlDeclaration_Invalid ()
  538. {
  539. string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
  540. <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
  541. <xsl:output omit-xml-declaration=""Yes"" />
  542. </xsl:stylesheet>";
  543. XslTransform xsltProcessor = new XslTransform ();
  544. xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
  545. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  546. }
  547. [Test]
  548. [ExpectedException (typeof (XsltCompileException))]
  549. public void Output_OmitXmlDeclaration_Empty ()
  550. {
  551. string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
  552. <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
  553. <xsl:output omit-xml-declaration="""" />
  554. </xsl:stylesheet>";
  555. XslTransform xsltProcessor = new XslTransform ();
  556. xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
  557. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  558. }
  559. [Test]
  560. public void Output_OmitXmlDeclaration_ForwardsCompatible ()
  561. {
  562. StringWriter sw = new StringWriter ();
  563. XsltArgumentList xsltArgs = new XsltArgumentList ();
  564. XslTransform xsltProcessor = new XslTransform ();
  565. XmlDocument xmlDoc = new XmlDocument ();
  566. xmlDoc.LoadXml ("<dummy />");
  567. string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
  568. <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.5"">
  569. <xsl:output omit-xml-declaration=""{0}"" />
  570. <xsl:template match=""/"">
  571. <root />
  572. </xsl:template>
  573. </xsl:stylesheet>";
  574. // omit-xml-declaration is "Yes"
  575. xsltProcessor.Load (new XmlTextReader (new StringReader (
  576. string.Format (xsltFragment, "Yes"))),
  577. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  578. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  579. Assert.AreEqual (
  580. "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
  581. "<root />", sw.ToString (), "#1");
  582. // omit-xml-declaration is empty
  583. sw.GetStringBuilder ().Length = 0;
  584. xsltProcessor.Load (new XmlTextReader (new StringReader (
  585. string.Format (xsltFragment, ""))),
  586. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  587. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  588. Assert.AreEqual (
  589. "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
  590. "<root />", sw.ToString (), "#2");
  591. }
  592. [Test]
  593. public void Output_DocType_Xml ()
  594. {
  595. XsltArgumentList xsltArgs = new XsltArgumentList ();
  596. XslTransform xsltProcessor = new XslTransform ();
  597. // set both doctype-system and doctype-public
  598. string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
  599. <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
  600. <xsl:output
  601. doctype-public=""-//W3C//DTD XHTML 1.0 Strict//EN""
  602. doctype-system=""http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"" />
  603. <xsl:template match=""/"">
  604. <xsl:element name=""test"">
  605. <xsl:element name=""abc"" />
  606. </xsl:element>
  607. </xsl:template>
  608. </xsl:stylesheet>";
  609. XmlDocument xmlDoc = new XmlDocument ();
  610. xmlDoc.LoadXml ("<dummy />");
  611. StringWriter sw = new StringWriter ();
  612. xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
  613. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  614. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  615. Assert.AreEqual (
  616. "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
  617. "<!DOCTYPE test PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">" +
  618. "<test><abc /></test>", sw.ToString (), "#1");
  619. // only set doctype-public
  620. 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
  623. doctype-public=""-//W3C//DTD XHTML 1.0 Strict//EN"" />
  624. <xsl:template match=""/"">
  625. <xsl:element name=""test"">
  626. <xsl:element name=""abc"" />
  627. </xsl:element>
  628. </xsl:template>
  629. </xsl:stylesheet>";
  630. sw.GetStringBuilder ().Length = 0;
  631. xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
  632. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  633. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  634. Assert.AreEqual (
  635. "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
  636. "<test><abc /></test>", sw.ToString (), "#2");
  637. // only set doctype-system
  638. xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
  639. <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
  640. <xsl:output
  641. indent=""no""
  642. doctype-system=""http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"" />
  643. <xsl:template match=""/"">
  644. <xsl:element name=""test"">
  645. <xsl:element name=""abc"" />
  646. </xsl:element>
  647. </xsl:template>
  648. </xsl:stylesheet>";
  649. sw.GetStringBuilder ().Length = 0;
  650. xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
  651. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  652. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  653. Assert.AreEqual (
  654. "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
  655. "<!DOCTYPE test SYSTEM \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">" +
  656. "<test><abc /></test>", sw.ToString (), "#3");
  657. // set empty doctype-public and empty doctype-system
  658. xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
  659. <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
  660. <xsl:output
  661. doctype-public=""""
  662. doctype-system="""" />
  663. <xsl:template match=""/"">
  664. <xsl:element name=""test"">
  665. <xsl:element name=""abc"" />
  666. </xsl:element>
  667. </xsl:template>
  668. </xsl:stylesheet>";
  669. sw.GetStringBuilder ().Length = 0;
  670. xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
  671. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  672. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  673. Assert.AreEqual (
  674. "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
  675. "<!DOCTYPE test PUBLIC \"\" \"\">" +
  676. "<test><abc /></test>", sw.ToString (), "#4");
  677. // set empty doctype-public
  678. xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
  679. <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
  680. <xsl:output
  681. indent=""no""
  682. doctype-public="""" />
  683. <xsl:template match=""/"">
  684. <xsl:element name=""test"">
  685. <xsl:element name=""abc"" />
  686. </xsl:element>
  687. </xsl:template>
  688. </xsl:stylesheet>";
  689. sw.GetStringBuilder ().Length = 0;
  690. xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
  691. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  692. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  693. Assert.AreEqual (
  694. "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
  695. "<test><abc /></test>", sw.ToString (), "#5");
  696. // set empty doctype-system
  697. xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
  698. <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
  699. <xsl:output
  700. doctype-system="""" />
  701. <xsl:template match=""/"">
  702. <xsl:element name=""test"">
  703. <xsl:element name=""abc"" />
  704. </xsl:element>
  705. </xsl:template>
  706. </xsl:stylesheet>";
  707. sw.GetStringBuilder ().Length = 0;
  708. xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
  709. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  710. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  711. Assert.AreEqual (
  712. "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
  713. "<!DOCTYPE test SYSTEM \"\">" +
  714. "<test><abc /></test>", sw.ToString (), "#6");
  715. }
  716. [Test]
  717. public void Output_DocType_Html ()
  718. {
  719. XsltArgumentList xsltArgs = new XsltArgumentList ();
  720. XslTransform xsltProcessor = new XslTransform ();
  721. // set both doctype-system and doctype-public
  722. string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
  723. <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
  724. <xsl:output
  725. method=""html""
  726. indent=""no""
  727. doctype-public=""-//W3C//DTD XHTML 1.0 Strict//EN""
  728. doctype-system=""http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"" />
  729. <xsl:template match=""/"">
  730. <xsl:element name=""test"">
  731. <xsl:element name=""abc"" />
  732. </xsl:element>
  733. </xsl:template>
  734. </xsl:stylesheet>";
  735. XmlDocument xmlDoc = new XmlDocument ();
  736. xmlDoc.LoadXml ("<dummy />");
  737. StringWriter sw = new StringWriter ();
  738. xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
  739. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  740. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  741. Assert.AreEqual (
  742. "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">" +
  743. "<test><abc></abc></test>", sw.ToString (), "#1");
  744. // only set doctype-public
  745. xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
  746. <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
  747. <xsl:output
  748. method=""html""
  749. indent=""no""
  750. doctype-public=""-//W3C//DTD XHTML 1.0 Strict//EN"" />
  751. <xsl:template match=""/"">
  752. <xsl:element name=""test"">
  753. <xsl:element name=""abc"" />
  754. </xsl:element>
  755. </xsl:template>
  756. </xsl:stylesheet>";
  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 ());
  761. Assert.AreEqual (
  762. "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" >" +
  763. "<test><abc></abc></test>", sw.ToString (), "#2");
  764. // only set doctype-system
  765. xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
  766. <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
  767. <xsl:output
  768. method=""html""
  769. indent=""no""
  770. doctype-system=""http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"" />
  771. <xsl:template match=""/"">
  772. <xsl:element name=""test"">
  773. <xsl:element name=""abc"" />
  774. </xsl:element>
  775. </xsl:template>
  776. </xsl:stylesheet>";
  777. sw.GetStringBuilder ().Length = 0;
  778. xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
  779. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  780. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  781. Assert.AreEqual (
  782. "<!DOCTYPE html SYSTEM \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">" +
  783. "<test><abc></abc></test>", sw.ToString (), "#3");
  784. // set empty doctype-public and empty doctype-system
  785. xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
  786. <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
  787. <xsl:output
  788. method=""html""
  789. indent=""no""
  790. doctype-public="""" doctype-system="""" />
  791. <xsl:template match=""/"">
  792. <xsl:element name=""test"">
  793. <xsl:element name=""abc"" />
  794. </xsl:element>
  795. </xsl:template>
  796. </xsl:stylesheet>";
  797. sw.GetStringBuilder ().Length = 0;
  798. xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
  799. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  800. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  801. Assert.AreEqual (
  802. "<!DOCTYPE html PUBLIC \"\" \"\">" +
  803. "<test><abc></abc></test>", sw.ToString (), "#4");
  804. // set empty doctype-public
  805. xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
  806. <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
  807. <xsl:output
  808. method=""html""
  809. indent=""no""
  810. doctype-public="""" />
  811. <xsl:template match=""/"">
  812. <xsl:element name=""test"">
  813. <xsl:element name=""abc"" />
  814. </xsl:element>
  815. </xsl:template>
  816. </xsl:stylesheet>";
  817. sw.GetStringBuilder ().Length = 0;
  818. xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
  819. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  820. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  821. Assert.AreEqual (
  822. "<!DOCTYPE html PUBLIC \"\" >" +
  823. "<test><abc></abc></test>", sw.ToString (), "#5");
  824. // set empty doctype-system
  825. xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
  826. <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
  827. <xsl:output
  828. method=""html""
  829. indent=""no""
  830. doctype-system="""" />
  831. <xsl:template match=""/"">
  832. <xsl:element name=""test"">
  833. <xsl:element name=""abc"" />
  834. </xsl:element>
  835. </xsl:template>
  836. </xsl:stylesheet>";
  837. sw.GetStringBuilder ().Length = 0;
  838. xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
  839. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  840. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  841. Assert.AreEqual (
  842. "<!DOCTYPE html SYSTEM \"\">" +
  843. "<test><abc></abc></test>", sw.ToString (), "#6");
  844. }
  845. [Test]
  846. [Category ("NotWorking")] // bug #77082: mono does not output newline after xml declaration
  847. public void Output_Indent_Xml_DocType ()
  848. {
  849. XsltArgumentList xsltArgs = new XsltArgumentList ();
  850. XslTransform xsltProcessor = new XslTransform ();
  851. string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
  852. <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
  853. <xsl:output
  854. doctype-public=""-//W3C//DTD XHTML 1.0 Strict//EN""
  855. doctype-system=""http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd""
  856. {0} />
  857. <xsl:template match=""/"">
  858. <xsl:element name=""test"">
  859. <xsl:element name=""something"">
  860. <xsl:element name=""else"" />
  861. </xsl:element>
  862. </xsl:element>
  863. </xsl:template>
  864. </xsl:stylesheet>";
  865. XmlDocument xmlDoc = new XmlDocument ();
  866. xmlDoc.LoadXml ("<dummy />");
  867. // set indent to yes
  868. StringWriter sw = new StringWriter ();
  869. xsltProcessor.Load (new XmlTextReader (new StringReader (
  870. string.Format (xsltFragment, "indent=\"yes\""))),
  871. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  872. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  873. Assert.AreEqual (string.Format(CultureInfo.InvariantCulture,
  874. "<?xml version=\"1.0\" encoding=\"utf-16\"?>{0}" +
  875. "<!DOCTYPE test PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">{0}" +
  876. "<test>{0}" +
  877. " <something>{0}" +
  878. " <else />{0}" +
  879. " </something>{0}" +
  880. "</test>", Environment.NewLine), sw.ToString (), "#1");
  881. // set indent to no
  882. sw.GetStringBuilder ().Length = 0;
  883. xsltProcessor.Load (new XmlTextReader (new StringReader (
  884. string.Format (xsltFragment, "indent=\"no\""))),
  885. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  886. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  887. Assert.AreEqual (
  888. "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
  889. "<!DOCTYPE test PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">" +
  890. "<test><something><else /></something></test>", sw.ToString (),
  891. "#2");
  892. // indent not set
  893. sw.GetStringBuilder ().Length = 0;
  894. xsltProcessor.Load (new XmlTextReader (new StringReader (
  895. string.Format (xsltFragment, ""))),
  896. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  897. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  898. Assert.AreEqual (
  899. "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
  900. "<!DOCTYPE test PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">" +
  901. "<test><something><else /></something></test>", sw.ToString (),
  902. "#3");
  903. }
  904. [Test]
  905. [Category ("NotWorking")] // bug #77081: mono does not output newline and indentation for non-html elements
  906. public void Output_Indent_Html_DocType ()
  907. {
  908. XsltArgumentList xsltArgs = new XsltArgumentList ();
  909. XslTransform xsltProcessor = new XslTransform ();
  910. string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
  911. <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
  912. <xsl:output
  913. method=""html""
  914. doctype-public=""-//W3C//DTD XHTML 1.0 Strict//EN""
  915. doctype-system=""http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd""
  916. {0} />
  917. <xsl:template match=""/"">
  918. <xsl:element name=""test"">
  919. <xsl:element name=""something"">
  920. <xsl:element name=""else"" />
  921. </xsl:element>
  922. </xsl:element>
  923. </xsl:template>
  924. </xsl:stylesheet>";
  925. XmlDocument xmlDoc = new XmlDocument ();
  926. xmlDoc.LoadXml ("<dummy />");
  927. // set indent to yes
  928. StringWriter sw = new StringWriter ();
  929. xsltProcessor.Load (new XmlTextReader (new StringReader (
  930. string.Format (xsltFragment, "indent=\"yes\""))),
  931. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  932. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  933. Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
  934. "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">{0}" +
  935. "<test>{0}" +
  936. " <something>{0}" +
  937. " <else>{0}" +
  938. " </else>{0}" +
  939. " </something>{0}" +
  940. "</test>", Environment.NewLine), sw.ToString (), "#1");
  941. // set indent to no
  942. sw.GetStringBuilder ().Length = 0;
  943. xsltProcessor.Load (new XmlTextReader (new StringReader (
  944. string.Format (xsltFragment, "indent=\"no\""))),
  945. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  946. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  947. Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
  948. "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">" +
  949. "<test><something><else></else></something></test>",
  950. Environment.NewLine), sw.ToString (), "#2");
  951. // indent not set
  952. sw.GetStringBuilder ().Length = 0;
  953. xsltProcessor.Load (new XmlTextReader (new StringReader (
  954. string.Format (xsltFragment, ""))),
  955. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  956. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  957. Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
  958. "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">{0}" +
  959. "<test>{0}" +
  960. " <something>{0}" +
  961. " <else>{0}" +
  962. " </else>{0}" +
  963. " </something>{0}" +
  964. "</test>", Environment.NewLine), sw.ToString (), "#3");
  965. }
  966. [Test]
  967. public void Output_Indent_Xml ()
  968. {
  969. XsltArgumentList xsltArgs = new XsltArgumentList ();
  970. XslTransform xsltProcessor = new XslTransform ();
  971. string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
  972. <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
  973. <xsl:output
  974. {0} />
  975. <xsl:template match=""/"">
  976. <xsl:element name=""test"">
  977. <xsl:element name=""something"">
  978. <xsl:element name=""else"" />
  979. </xsl:element>
  980. </xsl:element>
  981. </xsl:template>
  982. </xsl:stylesheet>";
  983. XmlDocument xmlDoc = new XmlDocument ();
  984. xmlDoc.LoadXml ("<dummy />");
  985. // set indent to yes
  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 ());
  991. Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
  992. "<?xml version=\"1.0\" encoding=\"utf-16\"?>{0}" +
  993. "<test>{0}" +
  994. " <something>{0}" +
  995. " <else />{0}" +
  996. " </something>{0}" +
  997. "</test>", Environment.NewLine), sw.ToString (), "#1");
  998. // set indent to no
  999. sw.GetStringBuilder ().Length = 0;
  1000. xsltProcessor.Load (new XmlTextReader (new StringReader (
  1001. string.Format (xsltFragment, "indent=\"no\""))),
  1002. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  1003. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  1004. Assert.AreEqual (
  1005. "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
  1006. "<test><something><else /></something></test>", sw.ToString (),
  1007. "#2");
  1008. // indent not set
  1009. sw.GetStringBuilder ().Length = 0;
  1010. xsltProcessor.Load (new XmlTextReader (new StringReader (
  1011. string.Format (xsltFragment, ""))),
  1012. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  1013. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  1014. Assert.AreEqual (
  1015. "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
  1016. "<test><something><else /></something></test>", sw.ToString (),
  1017. "#3");
  1018. }
  1019. [Test]
  1020. public void Output_Indent_Html ()
  1021. {
  1022. XsltArgumentList xsltArgs = new XsltArgumentList ();
  1023. XslTransform xsltProcessor = new XslTransform ();
  1024. string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
  1025. <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
  1026. <xsl:output
  1027. method=""html""
  1028. {0} />
  1029. <xsl:template match=""/"">
  1030. <xsl:element name=""html"">
  1031. <xsl:element name=""body"">
  1032. <xsl:element name=""p"" />
  1033. </xsl:element>
  1034. </xsl:element>
  1035. </xsl:template>
  1036. </xsl:stylesheet>";
  1037. XmlDocument xmlDoc = new XmlDocument ();
  1038. xmlDoc.LoadXml ("<dummy />");
  1039. // set indent to yes
  1040. StringWriter sw = new StringWriter ();
  1041. xsltProcessor.Load (new XmlTextReader (new StringReader (
  1042. string.Format (xsltFragment, "indent=\"yes\""))),
  1043. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  1044. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  1045. Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
  1046. "<html>{0}" +
  1047. " <body>{0}" +
  1048. " <p></p>{0}" +
  1049. " </body>{0}" +
  1050. "</html>", Environment.NewLine), sw.ToString (), "#1");
  1051. // set indent to no
  1052. sw.GetStringBuilder ().Length = 0;
  1053. xsltProcessor.Load (new XmlTextReader (new StringReader (
  1054. string.Format (xsltFragment, "indent=\"no\""))),
  1055. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  1056. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  1057. Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
  1058. "<html><body><p></p></body></html>",
  1059. Environment.NewLine), sw.ToString (), "#2");
  1060. // indent not set
  1061. sw.GetStringBuilder ().Length = 0;
  1062. xsltProcessor.Load (new XmlTextReader (new StringReader (
  1063. string.Format (xsltFragment, ""))),
  1064. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  1065. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  1066. Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
  1067. "<html>{0}" +
  1068. " <body>{0}" +
  1069. " <p></p>{0}" +
  1070. " </body>{0}" +
  1071. "</html>", Environment.NewLine), sw.ToString (), "#3");
  1072. }
  1073. [Test]
  1074. [ExpectedException (typeof (XsltCompileException))]
  1075. public void Output_Indent_Invalid ()
  1076. {
  1077. string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
  1078. <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
  1079. <xsl:output indent=""Yes"" />
  1080. </xsl:stylesheet>";
  1081. XslTransform xsltProcessor = new XslTransform ();
  1082. xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
  1083. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  1084. }
  1085. [Test]
  1086. [ExpectedException (typeof (XsltCompileException))]
  1087. public void Output_Indent_Empty ()
  1088. {
  1089. string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
  1090. <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
  1091. <xsl:output indent="""" />
  1092. </xsl:stylesheet>";
  1093. XslTransform xsltProcessor = new XslTransform ();
  1094. xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
  1095. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  1096. }
  1097. [Test]
  1098. public void Output_Indent_ForwardsCompatible ()
  1099. {
  1100. StringWriter sw = new StringWriter ();
  1101. XsltArgumentList xsltArgs = new XsltArgumentList ();
  1102. XslTransform xsltProcessor = new XslTransform ();
  1103. XmlDocument xmlDoc = new XmlDocument ();
  1104. xmlDoc.LoadXml ("<dummy />");
  1105. string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
  1106. <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.5"">
  1107. <xsl:output indent=""{0}"" />
  1108. <xsl:template match=""/"">
  1109. <root />
  1110. </xsl:template>
  1111. </xsl:stylesheet>";
  1112. // indent is "Yes"
  1113. xsltProcessor.Load (new XmlTextReader (new StringReader (
  1114. string.Format (xsltFragment, "Yes"))),
  1115. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  1116. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  1117. Assert.AreEqual (
  1118. "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
  1119. "<root />", sw.ToString (), "#1");
  1120. // indent is empty
  1121. sw.GetStringBuilder ().Length = 0;
  1122. xsltProcessor.Load (new XmlTextReader (new StringReader (
  1123. string.Format (xsltFragment, ""))),
  1124. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  1125. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  1126. Assert.AreEqual (
  1127. "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
  1128. "<root />", sw.ToString (), "#2");
  1129. }
  1130. [Test]
  1131. public void Output_MediaType ()
  1132. {
  1133. StringWriter sw = null;
  1134. XsltArgumentList xsltArgs = new XsltArgumentList ();
  1135. XslTransform xsltProcessor = new XslTransform ();
  1136. string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
  1137. <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
  1138. <xsl:output media-type=""whatever"" />
  1139. <xsl:template match=""/"">
  1140. <root />
  1141. </xsl:template>
  1142. </xsl:stylesheet>";
  1143. XmlDocument xmlDoc = new XmlDocument ();
  1144. xmlDoc.LoadXml ("<dummy />");
  1145. sw = new StringWriter ();
  1146. xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
  1147. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  1148. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  1149. Assert.AreEqual (
  1150. "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
  1151. "<root />", sw.ToString ());
  1152. }
  1153. [Test]
  1154. public void Output_Encoding_TextWriter ()
  1155. {
  1156. StringWriter sw = null;
  1157. XsltArgumentList xsltArgs = new XsltArgumentList ();
  1158. XslTransform xsltProcessor = new XslTransform ();
  1159. string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
  1160. <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
  1161. <xsl:output {0} />
  1162. <xsl:template match=""/"">
  1163. <root />
  1164. </xsl:template>
  1165. </xsl:stylesheet>";
  1166. XmlDocument xmlDoc = new XmlDocument ();
  1167. xmlDoc.LoadXml ("<dummy />");
  1168. // no encoding
  1169. sw = new StringWriter ();
  1170. xsltProcessor.Load (new XmlTextReader (new StringReader (
  1171. string.Format (xsltFragment, string.Empty))),
  1172. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  1173. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  1174. Assert.AreEqual (
  1175. "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
  1176. "<root />", sw.ToString (), "#1");
  1177. // valid encoding
  1178. sw.GetStringBuilder ().Length = 0;
  1179. xsltProcessor.Load (new XmlTextReader (new StringReader (
  1180. string.Format(xsltFragment, "encoding=\"iso-8859-1\""))),
  1181. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  1182. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  1183. Assert.AreEqual (
  1184. "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
  1185. "<root />", sw.ToString (), "#1");
  1186. // invalid encoding
  1187. sw.GetStringBuilder ().Length = 0;
  1188. xsltProcessor.Load (new XmlTextReader (new StringReader (
  1189. string.Format (xsltFragment, "encoding=\"doesnotexist\""))),
  1190. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  1191. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  1192. Assert.AreEqual (
  1193. "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
  1194. "<root />", sw.ToString (), "#2");
  1195. // empty encoding
  1196. sw.GetStringBuilder ().Length = 0;
  1197. xsltProcessor.Load (new XmlTextReader (new StringReader (
  1198. string.Format (xsltFragment, "encoding=\"\""))),
  1199. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  1200. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  1201. Assert.AreEqual (
  1202. "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
  1203. "<root />", sw.ToString (), "#3");
  1204. }
  1205. [Test]
  1206. public void Output_Encoding_Stream ()
  1207. {
  1208. MemoryStream ms = null;
  1209. string result = null;
  1210. XsltArgumentList xsltArgs = new XsltArgumentList ();
  1211. XslTransform xsltProcessor = new XslTransform ();
  1212. string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
  1213. <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
  1214. <xsl:output {0} />
  1215. <xsl:template match=""/"">
  1216. <root />
  1217. </xsl:template>
  1218. </xsl:stylesheet>";
  1219. XmlDocument xmlDoc = new XmlDocument ();
  1220. xmlDoc.LoadXml ("<dummy />");
  1221. // no encoding
  1222. ms = new MemoryStream ();
  1223. xsltProcessor.Load (new XmlTextReader (new StringReader (
  1224. string.Format (xsltFragment, string.Empty))),
  1225. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  1226. xsltProcessor.Transform (xmlDoc, xsltArgs, ms, new XmlUrlResolver ());
  1227. ms.Position = 0;
  1228. using (StreamReader sr = new StreamReader (ms, true)) {
  1229. result = sr.ReadToEnd ();
  1230. }
  1231. Assert.AreEqual (
  1232. "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
  1233. "<root />", result, "#1");
  1234. // valid encoding
  1235. ms = new MemoryStream ();
  1236. xsltProcessor.Load (new XmlTextReader (new StringReader (
  1237. string.Format (xsltFragment, "encoding=\"iso-8859-1\""))),
  1238. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  1239. xsltProcessor.Transform (xmlDoc, xsltArgs, ms, new XmlUrlResolver ());
  1240. ms.Position = 0;
  1241. using (StreamReader sr = new StreamReader (ms, true)) {
  1242. result = sr.ReadToEnd ();
  1243. }
  1244. Assert.AreEqual (
  1245. "<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>" +
  1246. "<root />", result, "#2");
  1247. // invalid encoding
  1248. ms = new MemoryStream ();
  1249. xsltProcessor.Load (new XmlTextReader (new StringReader (
  1250. string.Format (xsltFragment, "encoding=\"doesnotexist\""))),
  1251. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  1252. xsltProcessor.Transform (xmlDoc, xsltArgs, ms, new XmlUrlResolver ());
  1253. ms.Position = 0;
  1254. using (StreamReader sr = new StreamReader (ms, true)) {
  1255. result = sr.ReadToEnd ();
  1256. }
  1257. Assert.AreEqual (
  1258. "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
  1259. "<root />", result, "#3");
  1260. // empty encoding
  1261. ms = new MemoryStream ();
  1262. xsltProcessor.Load (new XmlTextReader (new StringReader (
  1263. string.Format (xsltFragment, "encoding=\"\""))),
  1264. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  1265. xsltProcessor.Transform (xmlDoc, xsltArgs, ms, new XmlUrlResolver ());
  1266. ms.Position = 0;
  1267. using (StreamReader sr = new StreamReader (ms, true)) {
  1268. result = sr.ReadToEnd ();
  1269. }
  1270. Assert.AreEqual (
  1271. "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
  1272. "<root />", result, "#4");
  1273. }
  1274. [Test]
  1275. public void Output_Version ()
  1276. {
  1277. StringWriter sw = null;
  1278. XsltArgumentList xsltArgs = new XsltArgumentList ();
  1279. XslTransform xsltProcessor = new XslTransform ();
  1280. string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
  1281. <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
  1282. <xsl:output version=""{0}"" />
  1283. <xsl:template match=""/"">
  1284. <root />
  1285. </xsl:template>
  1286. </xsl:stylesheet>";
  1287. XmlDocument xmlDoc = new XmlDocument ();
  1288. xmlDoc.LoadXml ("<dummy />");
  1289. // version 1.0
  1290. sw = new StringWriter ();
  1291. xsltProcessor.Load (new XmlTextReader (new StringReader (
  1292. string.Format (xsltFragment, "1.0"))),
  1293. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  1294. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  1295. Assert.AreEqual (
  1296. "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
  1297. "<root />", sw.ToString (), "#1");
  1298. // version 2.0
  1299. sw.GetStringBuilder ().Length = 0;
  1300. xsltProcessor.Load (new XmlTextReader (new StringReader (
  1301. string.Format (xsltFragment, "2.0"))),
  1302. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  1303. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  1304. Assert.AreEqual (
  1305. "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
  1306. "<root />", sw.ToString (), "#2");
  1307. // version BLABLA
  1308. sw.GetStringBuilder ().Length = 0;
  1309. xsltProcessor.Load (new XmlTextReader (new StringReader (
  1310. string.Format (xsltFragment, "BLABLA"))),
  1311. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  1312. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  1313. Assert.AreEqual (
  1314. "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
  1315. "<root />", sw.ToString (), "#3");
  1316. }
  1317. [Test]
  1318. public void Output_Method_Html_TextWriter ()
  1319. {
  1320. string options = null;
  1321. StringWriter sw = null;
  1322. XsltArgumentList xsltArgs = new XsltArgumentList ();
  1323. XslTransform xsltProcessor = new XslTransform ();
  1324. string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
  1325. <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
  1326. <xsl:output method=""html"" {0} />
  1327. <xsl:template match=""/"">
  1328. <xsl:element name=""html"">
  1329. <xsl:element name=""head"">
  1330. <xsl:element name=""title"">Output Test</xsl:element>
  1331. </xsl:element>
  1332. <xsl:element name=""Body"">
  1333. <xsl:element name=""BR"" />
  1334. </xsl:element>
  1335. </xsl:element>
  1336. </xsl:template>
  1337. </xsl:stylesheet>";
  1338. XmlDocument xmlDoc = new XmlDocument ();
  1339. xmlDoc.LoadXml ("<dummy />");
  1340. // indent not set, media-type not set
  1341. sw = new StringWriter ();
  1342. xsltProcessor.Load (new XmlTextReader (new StringReader (
  1343. string.Format (xsltFragment, string.Empty))),
  1344. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  1345. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  1346. Assert.AreEqual (string.Format(CultureInfo.InvariantCulture,
  1347. "<html>{0}" +
  1348. "{1}<head>{0}" +
  1349. "{1}{1}<META http-equiv=\"Content-Type\" content=\"text/html; charset=utf-16\">{0}" +
  1350. "{1}{1}<title>Output Test</title>{0}" +
  1351. "{1}</head>{0}" +
  1352. "{1}<Body>{0}" +
  1353. "{1}{1}<BR>{0}" +
  1354. "{1}</Body>{0}" +
  1355. "</html>", Environment.NewLine, " "), sw.ToString (), "#1");
  1356. // indent no, media-type not set
  1357. options = "indent=\"no\"";
  1358. sw.GetStringBuilder ().Length = 0;
  1359. xsltProcessor.Load (new XmlTextReader (new StringReader (
  1360. string.Format (xsltFragment, options))),
  1361. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  1362. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  1363. Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
  1364. "<html>{0}" +
  1365. "{1}<head>{0}" +
  1366. "{1}{1}<META http-equiv=\"Content-Type\" content=\"text/html; charset=utf-16\">{0}" +
  1367. "{1}{1}<title>Output Test</title>{0}" +
  1368. "{1}</head>{0}" +
  1369. "{1}<Body>{0}" +
  1370. "{1}{1}<BR>{0}" +
  1371. "{1}</Body>{0}" +
  1372. "</html>", string.Empty, string.Empty), sw.ToString (), "#2");
  1373. // indent yes, media-type "bla", omit-xml-declaration "no"
  1374. options = "indent=\"yes\" media-type=\"bla\"" +
  1375. " encoding=\"iso-8859-1\" omit-xml-declaration=\"no\"";
  1376. sw.GetStringBuilder ().Length = 0;
  1377. xsltProcessor.Load (new XmlTextReader (new StringReader (
  1378. string.Format (xsltFragment, options))),
  1379. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  1380. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  1381. Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
  1382. "<html>{0}" +
  1383. "{1}<head>{0}" +
  1384. "{1}{1}<META http-equiv=\"Content-Type\" content=\"bla; charset=utf-16\">{0}" +
  1385. "{1}{1}<title>Output Test</title>{0}" +
  1386. "{1}</head>{0}" +
  1387. "{1}<Body>{0}" +
  1388. "{1}{1}<BR>{0}" +
  1389. "{1}</Body>{0}" +
  1390. "</html>", Environment.NewLine, " "), sw.ToString (), "#3");
  1391. }
  1392. [Test]
  1393. public void Output_Method_Html_Stream ()
  1394. {
  1395. string options = null;
  1396. MemoryStream ms = null;
  1397. string result = null;
  1398. XsltArgumentList xsltArgs = new XsltArgumentList ();
  1399. XslTransform xsltProcessor = new XslTransform ();
  1400. string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
  1401. <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
  1402. <xsl:output method=""html"" {0} />
  1403. <xsl:template match=""/"">
  1404. <xsl:element name=""html"">
  1405. <xsl:element name=""head"">
  1406. <xsl:element name=""title"">Output Test</xsl:element>
  1407. </xsl:element>
  1408. <xsl:element name=""Body"">
  1409. <xsl:element name=""BR"" />
  1410. </xsl:element>
  1411. </xsl:element>
  1412. </xsl:template>
  1413. </xsl:stylesheet>";
  1414. XmlDocument xmlDoc = new XmlDocument ();
  1415. xmlDoc.LoadXml ("<dummy />");
  1416. // indent not set, media-type not set
  1417. ms = new MemoryStream ();
  1418. xsltProcessor.Load (new XmlTextReader (new StringReader (
  1419. string.Format (xsltFragment, string.Empty))),
  1420. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  1421. xsltProcessor.Transform (xmlDoc, xsltArgs, ms, new XmlUrlResolver ());
  1422. ms.Position = 0;
  1423. using (StreamReader sr = new StreamReader (ms, true)) {
  1424. result = sr.ReadToEnd ();
  1425. }
  1426. Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
  1427. "<html>{0}" +
  1428. "{1}<head>{0}" +
  1429. "{1}{1}<META http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">{0}" +
  1430. "{1}{1}<title>Output Test</title>{0}" +
  1431. "{1}</head>{0}" +
  1432. "{1}<Body>{0}" +
  1433. "{1}{1}<BR>{0}" +
  1434. "{1}</Body>{0}" +
  1435. "</html>", Environment.NewLine, " "), result, "#1");
  1436. // indent no, media-type not set
  1437. options = "indent=\"no\"";
  1438. ms = new MemoryStream ();
  1439. xsltProcessor.Load (new XmlTextReader (new StringReader (
  1440. string.Format (xsltFragment, options))),
  1441. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  1442. xsltProcessor.Transform (xmlDoc, xsltArgs, ms, new XmlUrlResolver ());
  1443. ms.Position = 0;
  1444. using (StreamReader sr = new StreamReader (ms, true)) {
  1445. result = sr.ReadToEnd ();
  1446. }
  1447. Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
  1448. "<html>{0}" +
  1449. "{1}<head>{0}" +
  1450. "{1}{1}<META http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">{0}" +
  1451. "{1}{1}<title>Output Test</title>{0}" +
  1452. "{1}</head>{0}" +
  1453. "{1}<Body>{0}" +
  1454. "{1}{1}<BR>{0}" +
  1455. "{1}</Body>{0}" +
  1456. "</html>", string.Empty, string.Empty), result, "#2");
  1457. // indent yes, media-type "bla", omit-xml-declaration "no"
  1458. options = "indent=\"yes\" media-type=\"bla\"" +
  1459. " encoding=\"iso-8859-1\" omit-xml-declaration=\"no\"";
  1460. ms = new MemoryStream ();
  1461. xsltProcessor.Load (new XmlTextReader (new StringReader (
  1462. string.Format (xsltFragment, options))),
  1463. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  1464. xsltProcessor.Transform (xmlDoc, xsltArgs, ms, new XmlUrlResolver ());
  1465. ms.Position = 0;
  1466. using (StreamReader sr = new StreamReader (ms, true)) {
  1467. result = sr.ReadToEnd ();
  1468. }
  1469. Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
  1470. "<html>{0}" +
  1471. "{1}<head>{0}" +
  1472. "{1}{1}<META http-equiv=\"Content-Type\" content=\"bla; charset=iso-8859-1\">{0}" +
  1473. "{1}{1}<title>Output Test</title>{0}" +
  1474. "{1}</head>{0}" +
  1475. "{1}<Body>{0}" +
  1476. "{1}{1}<BR>{0}" +
  1477. "{1}</Body>{0}" +
  1478. "</html>", Environment.NewLine, " "), result, "#3");
  1479. }
  1480. [Test]
  1481. [ExpectedException (typeof (XsltCompileException))]
  1482. public void Output_Unknown_Attribute ()
  1483. {
  1484. string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
  1485. <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
  1486. <xsl:output whatever="""" />
  1487. </xsl:stylesheet>";
  1488. XslTransform xsltProcessor = new XslTransform ();
  1489. xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
  1490. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  1491. }
  1492. [Test]
  1493. public void Output_Unknown_Attribute_ForwardsCompatible ()
  1494. {
  1495. StringWriter sw = new StringWriter ();
  1496. XsltArgumentList xsltArgs = new XsltArgumentList ();
  1497. XslTransform xsltProcessor = new XslTransform ();
  1498. XmlDocument xmlDoc = new XmlDocument ();
  1499. xmlDoc.LoadXml ("<dummy />");
  1500. string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
  1501. <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.5"">
  1502. <xsl:output whatever="""" />
  1503. <xsl:template match=""/"">
  1504. <root />
  1505. </xsl:template>
  1506. </xsl:stylesheet>";
  1507. xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
  1508. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  1509. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  1510. Assert.AreEqual (
  1511. "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
  1512. "<root />", sw.ToString (), "#1");
  1513. }
  1514. [Test]
  1515. public void Output_Unknown_Attribute_NonDefaultNamespace ()
  1516. {
  1517. string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
  1518. <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" xmlns:tst=""something"" version=""1.0"">
  1519. <xsl:output tst:whatever="""" />
  1520. </xsl:stylesheet>";
  1521. XslTransform xsltProcessor = new XslTransform ();
  1522. xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
  1523. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  1524. }
  1525. }
  1526. }