XslTransformTests.cs 84 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475
  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. using MonoTests.Helpers;
  18. namespace MonoTests.System.Xml.Xsl
  19. {
  20. [TestFixture]
  21. public class XslTransformTests
  22. {
  23. static readonly string end_of_line = "\r\n";
  24. XmlDocument doc;
  25. XslTransform xslt;
  26. XmlDocument result;
  27. [SetUp]
  28. public void GetReady()
  29. {
  30. doc = new XmlDocument ();
  31. xslt = new XslTransform ();
  32. result = new XmlDocument ();
  33. }
  34. [Test]
  35. public void TestBasicTransform ()
  36. {
  37. string output = Path.Combine (Path.GetTempPath (), "result.xml");
  38. doc.LoadXml ("<root/>");
  39. xslt.Load (TestResourceHelper.GetFullPathOfResource ("Test/XmlFiles/xsl/empty.xsl"));
  40. xslt.Transform (TestResourceHelper.GetFullPathOfResource ("Test/XmlFiles/xsl/empty.xsl"), output);
  41. result.Load (output);
  42. Assert.AreEqual (2, result.ChildNodes.Count, "count");
  43. }
  44. [Test]
  45. [ExpectedException (typeof (XsltCompileException))]
  46. public void InvalidStylesheet ()
  47. {
  48. XmlDocument doc = new XmlDocument ();
  49. doc.LoadXml ("<xsl:element xmlns:xsl='http://www.w3.org/1999/XSL/Transform' />");
  50. XslTransform t = new XslTransform ();
  51. t.Load (doc);
  52. }
  53. [Test]
  54. [ExpectedException (typeof (XsltCompileException))]
  55. public void EmptyStylesheet ()
  56. {
  57. XmlDocument doc = new XmlDocument ();
  58. XslTransform t = new XslTransform ();
  59. t.Load (doc);
  60. }
  61. [Test]
  62. [ExpectedException (typeof (XsltCompileException))]
  63. public void InvalidStylesheet2 ()
  64. {
  65. string xsl = @"<xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'>
  66. <xsl:template match='/root'>
  67. <xsl:call-template name='foo'>
  68. <xsl:with-param name='name' value='text()' />
  69. </xsl:call-template>
  70. </xsl:template>
  71. <xsl:template name='foo'>
  72. <xsl:param name='name' />
  73. <result>
  74. <xsl:if test='1'>
  75. <xsl:variable name='last' value='text()' />
  76. <xsl:value-of select='$last' />
  77. </xsl:if>
  78. </result>
  79. </xsl:template>
  80. </xsl:stylesheet>
  81. ";
  82. XslTransform xslt = new XslTransform ();
  83. xslt.Load (new XPathDocument (new XmlTextReader (xsl, XmlNodeType.Document, null)));
  84. }
  85. [Test]
  86. [Category ("MobileNotWorking")]
  87. public void MsxslTest() {
  88. string _styleSheet = @"
  89. <xslt:stylesheet xmlns:xslt=""http://www.w3.org/1999/XSL/Transform"" version=""1.0""
  90. xmlns:msxsl=""urn:schemas-microsoft-com:xslt"" xmlns:stringutils=""urn:schemas-sourceforge.net-blah"">
  91. <xslt:output method=""text"" />
  92. <msxsl:script language=""C#"" implements-prefix=""stringutils"">
  93. <![CDATA[
  94. string PadRight( string str, int padding) {
  95. return str.PadRight(padding);
  96. }
  97. ]]>
  98. </msxsl:script>
  99. <xslt:template match=""test"">
  100. <xslt:value-of select=""stringutils:PadRight(@name, 20)"" />
  101. </xslt:template>
  102. </xslt:stylesheet>";
  103. StringReader stringReader = new StringReader(_styleSheet);
  104. XslTransform transform = new XslTransform();
  105. XmlTextReader reader = new XmlTextReader(stringReader);
  106. transform.Load(reader, new XmlUrlResolver(), AppDomain.CurrentDomain.Evidence);
  107. StringBuilder sb = new StringBuilder();
  108. StringWriter writer = new StringWriter(sb, CultureInfo.InvariantCulture);
  109. XsltArgumentList arguments = new XsltArgumentList();
  110. XmlDocument xmlDoc = new XmlDocument();
  111. xmlDoc.LoadXml("<test name=\"test\" />");
  112. // Do transformation
  113. transform.Transform(xmlDoc, new XsltArgumentList(), writer, new XmlUrlResolver());
  114. Assert.AreEqual ("test".PadRight(20), sb.ToString());
  115. }
  116. [Test]
  117. public void MSXslNodeSet ()
  118. {
  119. string xsl = @"<xsl:stylesheet version='1.0'
  120. xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns:msxsl='urn:schemas-microsoft-com:xslt'>
  121. <xsl:template match='/'>
  122. <root>
  123. <xsl:variable name='var'>
  124. <xsl:copy-of select='root/foo' />
  125. </xsl:variable>
  126. <xsl:for-each select='msxsl:node-set($var)/foo'>
  127. <xsl:value-of select='name(.)' />: <xsl:value-of select='@attr' />
  128. </xsl:for-each>
  129. </root>
  130. </xsl:template>
  131. </xsl:stylesheet>";
  132. StringWriter sw = new StringWriter ();
  133. XslTransform t = new XslTransform ();
  134. t.Load (new XPathDocument (new StringReader (xsl)));
  135. t.Transform (new XPathDocument (new XmlTextReader (new StringReader ("<root><foo attr='A'/><foo attr='B'/><foo attr='C'/></root>"))), null, sw);
  136. Assert.AreEqual (@"<?xml version=""1.0"" encoding=""utf-16""?><root xmlns:msxsl=""urn:schemas-microsoft-com:xslt"">foo: Afoo: Bfoo: C</root>", sw.ToString ());
  137. }
  138. [Test]
  139. [ExpectedException (typeof (XPathException))]
  140. public void MSXslNodeSetRejectsNodeSet ()
  141. {
  142. string xsl = @"<xsl:stylesheet version='1.0'
  143. xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns:msxsl='urn:schemas-microsoft-com:xslt'>
  144. <xsl:template match='/'>
  145. <root>
  146. <!-- msxsl:node-set() does not accept a node set -->
  147. <xsl:for-each select='msxsl:node-set(root/foo)'>
  148. <xsl:value-of select='name(.)' />: <xsl:value-of select='@attr' />
  149. </xsl:for-each>
  150. </root>
  151. </xsl:template>
  152. </xsl:stylesheet>";
  153. StringWriter sw = new StringWriter ();
  154. XslTransform t = new XslTransform ();
  155. t.Load (new XPathDocument (new StringReader (xsl)));
  156. t.Transform (new XPathDocument (new XmlTextReader (new StringReader ("<root><foo attr='A'/><foo attr='B'/><foo attr='C'/></root>"))), null, sw);
  157. }
  158. [Test]
  159. [Category ("MobileNotWorking")]
  160. public void MSXslFormatDate ()
  161. {
  162. var arguments = new XsltArgumentList();
  163. arguments.AddParam("date", "", new DateTime (2010, 11, 22, 5, 4, 3));
  164. string xsl = @"
  165. <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"">
  166. <xsl:param name='date'/>
  167. <xsl:template match='/'>
  168. <root>
  169. <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>
  170. </root>
  171. </xsl:template>
  172. </xsl:stylesheet>";
  173. StringWriter sw = new StringWriter ();
  174. var t = new XslCompiledTransform ();
  175. t.Load (new XPathDocument (new StringReader (xsl)));
  176. t.Transform (new XPathDocument (new XmlTextReader (new StringReader ("<root></root>"))), arguments, sw);
  177. 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 ());
  178. }
  179. [Test]
  180. public void EvaluateEmptyVariableAsBoolean ()
  181. {
  182. string xsl = @"<xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'>
  183. <xsl:template match='/'>
  184. <xsl:variable name='var'><empty /></xsl:variable>
  185. <root><xsl:if test='$var'>true</xsl:if></root>
  186. </xsl:template>
  187. </xsl:stylesheet>";
  188. XslTransform t = new XslTransform ();
  189. t.Load (new XPathDocument (new StringReader (xsl)));
  190. StringWriter sw = new StringWriter ();
  191. t.Transform (
  192. new XPathDocument (new StringReader ("<root/>")),
  193. null,
  194. sw);
  195. Assert.IsTrue (sw.ToString ().IndexOf ("true") > 0);
  196. }
  197. [Test]
  198. [ExpectedException (typeof (XsltCompileException))]
  199. public void NotAllowedPatternAxis ()
  200. {
  201. string xsl = @"<xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'>
  202. <xsl:template match='/descendant-or-self::node()/elem'>
  203. <ERROR/>
  204. </xsl:template>
  205. </xsl:stylesheet>";
  206. new XslTransform ().Load (new XPathDocument (
  207. new StringReader (xsl)));
  208. }
  209. [Test]
  210. [ExpectedException (typeof (XsltCompileException))]
  211. public void ImportIncorrectlyLocated ()
  212. {
  213. string xsl = @"<xsl:transform xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'>
  214. <xsl:template match='/'></xsl:template>
  215. <xsl:import href='dummy.xsl' />
  216. </xsl:transform>";
  217. new XslTransform ().Load (new XPathDocument (
  218. new StringReader (xsl)));
  219. }
  220. private WeakReference StylesheetLoad (XslTransform t, string xsl)
  221. {
  222. XPathDocument doc = new XPathDocument (
  223. new StringReader (xsl));
  224. WeakReference wr = new WeakReference (doc);
  225. t.Load (doc);
  226. return wr;
  227. }
  228. private WeakReference StylesheetTransform (XslTransform t, string xml)
  229. {
  230. XPathDocument doc = new XPathDocument (
  231. new StringReader (xml));
  232. WeakReference wr = new WeakReference (doc);
  233. t.Transform (doc, null, TextWriter.Null, null);
  234. return wr;
  235. }
  236. [Test]
  237. // bug #75663.
  238. public void ErrorOnDocumentResolution ()
  239. {
  240. // XslTransform recovers from errors on document resolution.
  241. string xslText = @"<xsl:stylesheet
  242. xmlns:xsl='http://www.w3.org/1999/XSL/Transform'
  243. version='1.0'>
  244. <xsl:variable name='n'
  245. select='document(""notexist.xml"")' />
  246. <xsl:template match='/'>xx</xsl:template>
  247. </xsl:stylesheet>";
  248. string xmlText = @"<root />";
  249. XslTransform transform = new XslTransform ();
  250. XPathDocument doc = new XPathDocument (
  251. new XmlTextReader ("a.xsl", new StringReader (xslText)));
  252. transform.Load (doc);
  253. XPathDocument xmlDocument = new XPathDocument (new StringReader (xmlText));
  254. StringWriter sw = new StringWriter ();
  255. transform.Transform (xmlDocument, null, sw);
  256. Assert.AreEqual (
  257. "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
  258. "xx", sw.ToString ());
  259. }
  260. // bug #76046
  261. [Test]
  262. public void LoadStyleFromNonRoot ()
  263. {
  264. XmlDocument doc = new XmlDocument ();
  265. XslTransform xslt = new XslTransform ();
  266. doc.LoadXml ("<root><dummy /><xsl:transform xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0' /></root>");
  267. XmlNode node = doc.ChildNodes [0].ChildNodes [1];
  268. xslt.Load (node, null, null);
  269. }
  270. [Test]
  271. public void ReturnEmptyResultsAsXmlReader ()
  272. {
  273. // bug #76115
  274. XmlDocument doc = new XmlDocument ();
  275. doc.LoadXml ("<xsl:transform xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0' />");
  276. XslTransform xslt = new XslTransform ();
  277. xslt.Load (doc, null, null);
  278. XmlReader reader = xslt.Transform(doc, null, new XmlUrlResolver ());
  279. reader.Read ();
  280. // another case - with xsl:output standalone='yes'
  281. 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>");
  282. xslt = new XslTransform ();
  283. xslt.Load (doc, null, null);
  284. reader = xslt.Transform (doc, null, new XmlUrlResolver ());
  285. while (!reader.EOF)
  286. reader.Read (); // btw no XMLdecl output.
  287. }
  288. [Test] // bug #76530
  289. // http://www.w3.org/TR/xslt#section-Creating-Elements-with-xsl:element
  290. // "If the namespace attribute is not present then the QName
  291. // is expanded into an expanded-name using the namespace
  292. // declarations in effect for the xsl:element element,
  293. // including any default namespace declaration."
  294. public void LREDefaultNamespace ()
  295. {
  296. string xsl = @"<xsl:stylesheet version='1.0' xmlns='urn:foo' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
  297. <xsl:template match='/*'>
  298. <xsl:element name='{local-name()}' />
  299. </xsl:template>
  300. </xsl:stylesheet>";
  301. string xml = "<root/>";
  302. XslTransform t = new XslTransform ();
  303. t.Load (new XPathDocument (new StringReader (xsl)));
  304. StringWriter sw = new StringWriter ();
  305. XmlTextWriter xw = new XmlTextWriter (sw);
  306. t.Transform (
  307. new XPathDocument (new StringReader (xml)),
  308. null, xw);
  309. Assert.AreEqual ("<root xmlns=\"urn:foo\" />",
  310. sw.ToString ());
  311. string xsl2 = @"<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns='urn:foo'>
  312. <xsl:template match='/*'>
  313. <root>
  314. <xsl:element name='{local-name()}' />
  315. </root>
  316. </xsl:template>
  317. </xsl:stylesheet>";
  318. string xml2 = "<page/>";
  319. t.Load (new XPathDocument (new StringReader (xsl2)));
  320. sw = new StringWriter ();
  321. xw = new XmlTextWriter (sw);
  322. t.Transform (
  323. new XPathDocument (new StringReader (xml2)),
  324. null, xw);
  325. Assert.AreEqual ("<root xmlns=\"urn:foo\"><page /></root>",
  326. sw.ToString ());
  327. }
  328. [Test]
  329. // http://lists.ximian.com/pipermail/mono-devel-list/2005-November/015812.html
  330. public void WhitespaceHandling ()
  331. {
  332. string ref_out = @"XML
  333. Extensible Markup language
  334. Great stuffs
  335. XSLT
  336. Extensible Markup language
  337. Great stuffs
  338. XPATH
  339. Extensible Markup language
  340. Great stuffs
  341. XSD
  342. Extensible Markup language
  343. Great stuffs
  344. ";
  345. XmlDocument d = new XmlDocument ();
  346. d.Load (TestResourceHelper.GetFullPathOfResource ("Test/XmlFiles/xsl/91834.xml"));
  347. XslTransform t = new XslTransform ();
  348. t.Load (TestResourceHelper.GetFullPathOfResource ("Test/XmlFiles/xsl/91834.xsl"));
  349. StringWriter sw_raw = new StringWriter ();
  350. t.Transform (d, null, sw_raw);
  351. Assert.AreEqual (ref_out.Replace ("\r\n", "\n"), sw_raw.ToString ().Replace ("\r\n", "\n"));
  352. }
  353. // http://support.microsoft.com/default.aspx?scid=kb;en-us;829014
  354. [Test]
  355. public void EmptyNodeSetSort ()
  356. {
  357. string xmlFragment = @"<?xml version=""1.0"" encoding=""utf-8""?>
  358. <EMPLOYEES>
  359. <EMPLOYEE>
  360. <NAME>Steve</NAME>
  361. <DEPT>IT</DEPT>
  362. <SKILL>C++</SKILL>
  363. <SKILL>C#</SKILL>
  364. </EMPLOYEE>
  365. <EMPLOYEE>
  366. <NAME>John</NAME>
  367. <DEPT>IT</DEPT>
  368. <SKILL>VB.NET</SKILL>
  369. <SKILL>SQl Server</SKILL>
  370. </EMPLOYEE>
  371. </EMPLOYEES>";
  372. string xsltFragment = @"<?xml version=""1.0""?>
  373. <xsl:stylesheet version=""1.0"" xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"">
  374. <xsl:output omit-xml-declaration=""yes"" />
  375. <xsl:preserve-space elements=""*"" />
  376. <xsl:template match=""/EMPLOYEES"">
  377. <xsl:for-each select=""EMPLOYEE[DEPT='Finance']"">
  378. <xsl:sort select=""NAME""/>
  379. <xsl:value-of select=""NAME""/>
  380. </xsl:for-each>
  381. </xsl:template>
  382. </xsl:stylesheet>";
  383. XmlTextReader xmlRdr = new XmlTextReader (new StringReader (xmlFragment));
  384. XmlTextReader xsltRdr = new XmlTextReader (new StringReader (xsltFragment));
  385. XslTransform stylesheet = new XslTransform ();
  386. stylesheet.Load (xsltRdr, new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  387. StringWriter sw = new StringWriter ();
  388. stylesheet.Transform (new XPathDocument (xmlRdr), new XsltArgumentList (),
  389. sw, new XmlUrlResolver ());
  390. Assert.AreEqual (0, sw.ToString ().Length);
  391. }
  392. // http://support.microsoft.com/default.aspx?scid=kb;en-us;834667
  393. [Test]
  394. //[Category ("NotDotNet")]
  395. public void LocalParameter ()
  396. {
  397. string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
  398. <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
  399. <xsl:param name=""param1"" select=""'global-param1-default'"" />
  400. <xsl:param name=""param2"" select=""'global-param2-default'"" />
  401. <xsl:output method=""text"" encoding=""ascii"" />
  402. <xsl:template match=""/"">
  403. <xsl:call-template name=""Test"">
  404. <xsl:with-param name=""param1"" select=""'local-param1-arg'"" />
  405. <xsl:with-param name=""param2"" select=""'local-param2-arg'"" />
  406. </xsl:call-template>
  407. </xsl:template>
  408. <xsl:template name=""Test"">
  409. <xsl:param name=""param1"" select=""'local-param1-default'"" />
  410. <xsl:param name=""param2"" select=""'local-param2-default'"" />
  411. <xsl:value-of select=""$param1"" /><xsl:text>/</xsl:text><xsl:value-of select=""$param2"" />
  412. </xsl:template>
  413. </xsl:stylesheet>";
  414. XmlDocument xmlDoc = new XmlDocument ();
  415. xmlDoc.LoadXml ("<dummy />");
  416. XslTransform xsltProcessor = new XslTransform ();
  417. xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
  418. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  419. StringWriter sw = new StringWriter ();
  420. XsltArgumentList xsltArgs = new XsltArgumentList ();
  421. xsltArgs.AddParam ("param1", string.Empty, "global-param1-arg");
  422. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  423. Assert.AreEqual ("local-param1-arg/local-param2-arg", sw.ToString ());
  424. }
  425. [Test]
  426. public void Output_Standalone ()
  427. {
  428. StringWriter sw = null;
  429. XsltArgumentList xsltArgs = new XsltArgumentList ();
  430. XslTransform xsltProcessor = new XslTransform ();
  431. string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
  432. <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
  433. <xsl:output {0} />
  434. <xsl:template match=""/"">
  435. <root />
  436. </xsl:template>
  437. </xsl:stylesheet>";
  438. XmlDocument xmlDoc = new XmlDocument ();
  439. xmlDoc.LoadXml ("<dummy />");
  440. sw = new StringWriter ();
  441. xsltProcessor.Load (new XmlTextReader (new StringReader (
  442. string.Format(xsltFragment, "standalone=\"yes\""))),
  443. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  444. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  445. Assert.AreEqual (
  446. "<?xml version=\"1.0\" encoding=\"utf-16\"" +
  447. " standalone=\"yes\"?><root />", sw.ToString (), "#1");
  448. sw = new StringWriter ();
  449. xsltProcessor.Load (new XmlTextReader (new StringReader (
  450. string.Format (xsltFragment, "standalone=\"no\""))),
  451. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  452. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  453. Assert.AreEqual (
  454. "<?xml version=\"1.0\" encoding=\"utf-16\"" +
  455. " standalone=\"no\"?><root />", sw.ToString (), "#2");
  456. sw = new StringWriter ();
  457. xsltProcessor.Load (new XmlTextReader (new StringReader (
  458. string.Format (xsltFragment, ""))),
  459. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  460. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  461. Assert.AreEqual (
  462. "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
  463. "<root />", sw.ToString (), "#3");
  464. }
  465. [Test]
  466. [ExpectedException (typeof (XsltCompileException))]
  467. public void Output_Standalone_Invalid ()
  468. {
  469. string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
  470. <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
  471. <xsl:output standalone=""Yes"" />
  472. </xsl:stylesheet>";
  473. XslTransform xsltProcessor = new XslTransform ();
  474. xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
  475. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  476. }
  477. [Test]
  478. public void Output_Standalone_ForwardsCompatible ()
  479. {
  480. StringWriter sw = new StringWriter ();
  481. XsltArgumentList xsltArgs = new XsltArgumentList ();
  482. XslTransform xsltProcessor = new XslTransform ();
  483. XmlDocument xmlDoc = new XmlDocument ();
  484. xmlDoc.LoadXml ("<dummy />");
  485. string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
  486. <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.5"">
  487. <xsl:output standalone=""{0}"" />
  488. <xsl:template match=""/"">
  489. <root />
  490. </xsl:template>
  491. </xsl:stylesheet>";
  492. // standalone is "Yes"
  493. xsltProcessor.Load (new XmlTextReader (new StringReader (
  494. string.Format (xsltFragment, "Yes"))),
  495. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  496. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  497. Assert.AreEqual (
  498. "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
  499. "<root />", sw.ToString (), "#1");
  500. // standalone is empty
  501. sw.GetStringBuilder ().Length = 0;
  502. xsltProcessor.Load (new XmlTextReader (new StringReader (
  503. string.Format (xsltFragment, ""))),
  504. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  505. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  506. Assert.AreEqual (
  507. "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
  508. "<root />", sw.ToString (), "#2");
  509. }
  510. [Test]
  511. [ExpectedException (typeof (XsltCompileException))]
  512. public void Output_Standalone_Empty ()
  513. {
  514. string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
  515. <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
  516. <xsl:output standalone="""" />
  517. </xsl:stylesheet>";
  518. XslTransform xsltProcessor = new XslTransform ();
  519. xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
  520. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  521. }
  522. [Test]
  523. public void Output_OmitXmlDeclaration ()
  524. {
  525. StringWriter sw = null;
  526. XsltArgumentList xsltArgs = new XsltArgumentList ();
  527. XslTransform xsltProcessor = new XslTransform ();
  528. string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
  529. <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
  530. <xsl:output {0} />
  531. <xsl:template match=""/"">
  532. <root />
  533. </xsl:template>
  534. </xsl:stylesheet>";
  535. XmlDocument xmlDoc = new XmlDocument ();
  536. xmlDoc.LoadXml ("<dummy />");
  537. sw = new StringWriter ();
  538. xsltProcessor.Load (new XmlTextReader (new StringReader (
  539. string.Format (xsltFragment, "omit-xml-declaration=\"yes\""))),
  540. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  541. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  542. Assert.AreEqual ("<root />", sw.ToString (), "#1");
  543. sw.GetStringBuilder ().Length = 0;
  544. xsltProcessor.Load (new XmlTextReader (new StringReader (
  545. string.Format (xsltFragment, "omit-xml-declaration=\"no\""))),
  546. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  547. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  548. Assert.AreEqual (
  549. "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
  550. "<root />", sw.ToString (), "#2");
  551. }
  552. [Test]
  553. [ExpectedException (typeof (XsltCompileException))]
  554. public void Output_OmitXmlDeclaration_Invalid ()
  555. {
  556. string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
  557. <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
  558. <xsl:output omit-xml-declaration=""Yes"" />
  559. </xsl:stylesheet>";
  560. XslTransform xsltProcessor = new XslTransform ();
  561. xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
  562. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  563. }
  564. [Test]
  565. [ExpectedException (typeof (XsltCompileException))]
  566. public void Output_OmitXmlDeclaration_Empty ()
  567. {
  568. string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
  569. <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
  570. <xsl:output omit-xml-declaration="""" />
  571. </xsl:stylesheet>";
  572. XslTransform xsltProcessor = new XslTransform ();
  573. xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
  574. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  575. }
  576. [Test]
  577. public void Output_OmitXmlDeclaration_ForwardsCompatible ()
  578. {
  579. StringWriter sw = new StringWriter ();
  580. XsltArgumentList xsltArgs = new XsltArgumentList ();
  581. XslTransform xsltProcessor = new XslTransform ();
  582. XmlDocument xmlDoc = new XmlDocument ();
  583. xmlDoc.LoadXml ("<dummy />");
  584. string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
  585. <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.5"">
  586. <xsl:output omit-xml-declaration=""{0}"" />
  587. <xsl:template match=""/"">
  588. <root />
  589. </xsl:template>
  590. </xsl:stylesheet>";
  591. // omit-xml-declaration is "Yes"
  592. xsltProcessor.Load (new XmlTextReader (new StringReader (
  593. string.Format (xsltFragment, "Yes"))),
  594. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  595. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  596. Assert.AreEqual (
  597. "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
  598. "<root />", sw.ToString (), "#1");
  599. // omit-xml-declaration is empty
  600. sw.GetStringBuilder ().Length = 0;
  601. xsltProcessor.Load (new XmlTextReader (new StringReader (
  602. string.Format (xsltFragment, ""))),
  603. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  604. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  605. Assert.AreEqual (
  606. "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
  607. "<root />", sw.ToString (), "#2");
  608. }
  609. [Test]
  610. public void Output_DocType_Xml ()
  611. {
  612. XsltArgumentList xsltArgs = new XsltArgumentList ();
  613. XslTransform xsltProcessor = new XslTransform ();
  614. // set both doctype-system and doctype-public
  615. string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
  616. <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
  617. <xsl:output
  618. doctype-public=""-//W3C//DTD XHTML 1.0 Strict//EN""
  619. doctype-system=""http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"" />
  620. <xsl:template match=""/"">
  621. <xsl:element name=""test"">
  622. <xsl:element name=""abc"" />
  623. </xsl:element>
  624. </xsl:template>
  625. </xsl:stylesheet>";
  626. XmlDocument xmlDoc = new XmlDocument ();
  627. xmlDoc.LoadXml ("<dummy />");
  628. StringWriter sw = new StringWriter ();
  629. xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
  630. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  631. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  632. Assert.AreEqual (
  633. "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
  634. "<!DOCTYPE test PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">" +
  635. "<test><abc /></test>", sw.ToString (), "#1");
  636. // only set doctype-public
  637. xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
  638. <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
  639. <xsl:output
  640. doctype-public=""-//W3C//DTD XHTML 1.0 Strict//EN"" />
  641. <xsl:template match=""/"">
  642. <xsl:element name=""test"">
  643. <xsl:element name=""abc"" />
  644. </xsl:element>
  645. </xsl:template>
  646. </xsl:stylesheet>";
  647. sw.GetStringBuilder ().Length = 0;
  648. xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
  649. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  650. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  651. Assert.AreEqual (
  652. "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
  653. "<test><abc /></test>", sw.ToString (), "#2");
  654. // only set doctype-system
  655. xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
  656. <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
  657. <xsl:output
  658. indent=""no""
  659. doctype-system=""http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"" />
  660. <xsl:template match=""/"">
  661. <xsl:element name=""test"">
  662. <xsl:element name=""abc"" />
  663. </xsl:element>
  664. </xsl:template>
  665. </xsl:stylesheet>";
  666. sw.GetStringBuilder ().Length = 0;
  667. xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
  668. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  669. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  670. Assert.AreEqual (
  671. "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
  672. "<!DOCTYPE test SYSTEM \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">" +
  673. "<test><abc /></test>", sw.ToString (), "#3");
  674. // set empty doctype-public and empty doctype-system
  675. xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
  676. <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
  677. <xsl:output
  678. doctype-public=""""
  679. doctype-system="""" />
  680. <xsl:template match=""/"">
  681. <xsl:element name=""test"">
  682. <xsl:element name=""abc"" />
  683. </xsl:element>
  684. </xsl:template>
  685. </xsl:stylesheet>";
  686. sw.GetStringBuilder ().Length = 0;
  687. xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
  688. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  689. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  690. Assert.AreEqual (
  691. "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
  692. "<!DOCTYPE test PUBLIC \"\" \"\">" +
  693. "<test><abc /></test>", sw.ToString (), "#4");
  694. // set empty doctype-public
  695. xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
  696. <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
  697. <xsl:output
  698. indent=""no""
  699. doctype-public="""" />
  700. <xsl:template match=""/"">
  701. <xsl:element name=""test"">
  702. <xsl:element name=""abc"" />
  703. </xsl:element>
  704. </xsl:template>
  705. </xsl:stylesheet>";
  706. sw.GetStringBuilder ().Length = 0;
  707. xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
  708. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  709. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  710. Assert.AreEqual (
  711. "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
  712. "<test><abc /></test>", sw.ToString (), "#5");
  713. // set empty doctype-system
  714. xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
  715. <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
  716. <xsl:output
  717. doctype-system="""" />
  718. <xsl:template match=""/"">
  719. <xsl:element name=""test"">
  720. <xsl:element name=""abc"" />
  721. </xsl:element>
  722. </xsl:template>
  723. </xsl:stylesheet>";
  724. sw.GetStringBuilder ().Length = 0;
  725. xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
  726. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  727. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  728. Assert.AreEqual (
  729. "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
  730. "<!DOCTYPE test SYSTEM \"\">" +
  731. "<test><abc /></test>", sw.ToString (), "#6");
  732. }
  733. [Test]
  734. public void Output_DocType_Html ()
  735. {
  736. XsltArgumentList xsltArgs = new XsltArgumentList ();
  737. XslTransform xsltProcessor = new XslTransform ();
  738. // set both doctype-system and doctype-public
  739. string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
  740. <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
  741. <xsl:output
  742. method=""html""
  743. indent=""no""
  744. doctype-public=""-//W3C//DTD XHTML 1.0 Strict//EN""
  745. doctype-system=""http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"" />
  746. <xsl:template match=""/"">
  747. <xsl:element name=""test"">
  748. <xsl:element name=""abc"" />
  749. </xsl:element>
  750. </xsl:template>
  751. </xsl:stylesheet>";
  752. XmlDocument xmlDoc = new XmlDocument ();
  753. xmlDoc.LoadXml ("<dummy />");
  754. StringWriter sw = new StringWriter ();
  755. xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
  756. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  757. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  758. Assert.AreEqual (
  759. "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">" +
  760. "<test><abc></abc></test>", sw.ToString (), "#1");
  761. // only set doctype-public
  762. xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
  763. <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
  764. <xsl:output
  765. method=""html""
  766. indent=""no""
  767. doctype-public=""-//W3C//DTD XHTML 1.0 Strict//EN"" />
  768. <xsl:template match=""/"">
  769. <xsl:element name=""test"">
  770. <xsl:element name=""abc"" />
  771. </xsl:element>
  772. </xsl:template>
  773. </xsl:stylesheet>";
  774. sw.GetStringBuilder ().Length = 0;
  775. xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
  776. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  777. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  778. Assert.AreEqual (
  779. "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" >" +
  780. "<test><abc></abc></test>", sw.ToString (), "#2");
  781. // only set doctype-system
  782. xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
  783. <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
  784. <xsl:output
  785. method=""html""
  786. indent=""no""
  787. doctype-system=""http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"" />
  788. <xsl:template match=""/"">
  789. <xsl:element name=""test"">
  790. <xsl:element name=""abc"" />
  791. </xsl:element>
  792. </xsl:template>
  793. </xsl:stylesheet>";
  794. sw.GetStringBuilder ().Length = 0;
  795. xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
  796. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  797. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  798. Assert.AreEqual (
  799. "<!DOCTYPE html SYSTEM \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">" +
  800. "<test><abc></abc></test>", sw.ToString (), "#3");
  801. // set empty doctype-public and empty doctype-system
  802. xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
  803. <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
  804. <xsl:output
  805. method=""html""
  806. indent=""no""
  807. doctype-public="""" doctype-system="""" />
  808. <xsl:template match=""/"">
  809. <xsl:element name=""test"">
  810. <xsl:element name=""abc"" />
  811. </xsl:element>
  812. </xsl:template>
  813. </xsl:stylesheet>";
  814. sw.GetStringBuilder ().Length = 0;
  815. xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
  816. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  817. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  818. Assert.AreEqual (
  819. "<!DOCTYPE html PUBLIC \"\" \"\">" +
  820. "<test><abc></abc></test>", sw.ToString (), "#4");
  821. // set empty doctype-public
  822. xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
  823. <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
  824. <xsl:output
  825. method=""html""
  826. indent=""no""
  827. doctype-public="""" />
  828. <xsl:template match=""/"">
  829. <xsl:element name=""test"">
  830. <xsl:element name=""abc"" />
  831. </xsl:element>
  832. </xsl:template>
  833. </xsl:stylesheet>";
  834. sw.GetStringBuilder ().Length = 0;
  835. xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
  836. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  837. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  838. Assert.AreEqual (
  839. "<!DOCTYPE html PUBLIC \"\" >" +
  840. "<test><abc></abc></test>", sw.ToString (), "#5");
  841. // set empty doctype-system
  842. xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
  843. <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
  844. <xsl:output
  845. method=""html""
  846. indent=""no""
  847. doctype-system="""" />
  848. <xsl:template match=""/"">
  849. <xsl:element name=""test"">
  850. <xsl:element name=""abc"" />
  851. </xsl:element>
  852. </xsl:template>
  853. </xsl:stylesheet>";
  854. sw.GetStringBuilder ().Length = 0;
  855. xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
  856. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  857. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  858. Assert.AreEqual (
  859. "<!DOCTYPE html SYSTEM \"\">" +
  860. "<test><abc></abc></test>", sw.ToString (), "#6");
  861. }
  862. [Test]
  863. public void Output_Indent_Xml_DocType ()
  864. {
  865. XsltArgumentList xsltArgs = new XsltArgumentList ();
  866. XslTransform xsltProcessor = new XslTransform ();
  867. string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
  868. <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
  869. <xsl:output
  870. doctype-public=""-//W3C//DTD XHTML 1.0 Strict//EN""
  871. doctype-system=""http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd""
  872. {0} />
  873. <xsl:template match=""/"">
  874. <xsl:element name=""test"">
  875. <xsl:element name=""something"">
  876. <xsl:element name=""else"" />
  877. </xsl:element>
  878. </xsl:element>
  879. </xsl:template>
  880. </xsl:stylesheet>";
  881. XmlDocument xmlDoc = new XmlDocument ();
  882. xmlDoc.LoadXml ("<dummy />");
  883. // set indent to yes
  884. StringWriter sw = new StringWriter ();
  885. xsltProcessor.Load (new XmlTextReader (new StringReader (
  886. string.Format (xsltFragment, "indent=\"yes\""))),
  887. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  888. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  889. Assert.AreEqual (string.Format(CultureInfo.InvariantCulture,
  890. "<?xml version=\"1.0\" encoding=\"utf-16\"?>{0}" +
  891. "<!DOCTYPE test PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">{0}" +
  892. "<test>{0}" +
  893. " <something>{0}" +
  894. " <else />{0}" +
  895. " </something>{0}" +
  896. "</test>", end_of_line), sw.ToString (), "#1");
  897. // set indent to no
  898. sw.GetStringBuilder ().Length = 0;
  899. xsltProcessor.Load (new XmlTextReader (new StringReader (
  900. string.Format (xsltFragment, "indent=\"no\""))),
  901. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  902. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  903. Assert.AreEqual (
  904. "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
  905. "<!DOCTYPE test PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">" +
  906. "<test><something><else /></something></test>", sw.ToString (),
  907. "#2");
  908. // indent not set
  909. sw.GetStringBuilder ().Length = 0;
  910. xsltProcessor.Load (new XmlTextReader (new StringReader (
  911. string.Format (xsltFragment, ""))),
  912. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  913. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  914. Assert.AreEqual (
  915. "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
  916. "<!DOCTYPE test PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">" +
  917. "<test><something><else /></something></test>", sw.ToString (),
  918. "#3");
  919. }
  920. [Test]
  921. public void Output_Indent_Html_DocType ()
  922. {
  923. XsltArgumentList xsltArgs = new XsltArgumentList ();
  924. XslTransform xsltProcessor = new XslTransform ();
  925. string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
  926. <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
  927. <xsl:output
  928. method=""html""
  929. doctype-public=""-//W3C//DTD XHTML 1.0 Strict//EN""
  930. doctype-system=""http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd""
  931. {0} />
  932. <xsl:template match=""/"">
  933. <xsl:element name=""test"">
  934. <xsl:element name=""something"">
  935. <xsl:element name=""else"" />
  936. </xsl:element>
  937. </xsl:element>
  938. </xsl:template>
  939. </xsl:stylesheet>";
  940. XmlDocument xmlDoc = new XmlDocument ();
  941. xmlDoc.LoadXml ("<dummy />");
  942. // set indent to yes
  943. StringWriter sw = new StringWriter ();
  944. xsltProcessor.Load (new XmlTextReader (new StringReader (
  945. string.Format (xsltFragment, "indent=\"yes\""))),
  946. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  947. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  948. Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
  949. "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">{0}" +
  950. "<test>{0}" +
  951. " <something>{0}" +
  952. " <else>{0}" +
  953. " </else>{0}" +
  954. " </something>{0}" +
  955. "</test>", end_of_line), sw.ToString (), "#1");
  956. // set indent to no
  957. sw.GetStringBuilder ().Length = 0;
  958. xsltProcessor.Load (new XmlTextReader (new StringReader (
  959. string.Format (xsltFragment, "indent=\"no\""))),
  960. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  961. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  962. Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
  963. "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">" +
  964. "<test><something><else></else></something></test>",
  965. Environment.NewLine), sw.ToString (), "#2");
  966. // indent not set
  967. sw.GetStringBuilder ().Length = 0;
  968. xsltProcessor.Load (new XmlTextReader (new StringReader (
  969. string.Format (xsltFragment, ""))),
  970. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  971. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  972. Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
  973. "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">{0}" +
  974. "<test>{0}" +
  975. " <something>{0}" +
  976. " <else>{0}" +
  977. " </else>{0}" +
  978. " </something>{0}" +
  979. "</test>", end_of_line), sw.ToString (), "#3");
  980. }
  981. [Test]
  982. public void Output_Indent_Xml ()
  983. {
  984. XsltArgumentList xsltArgs = new XsltArgumentList ();
  985. XslTransform xsltProcessor = new XslTransform ();
  986. string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
  987. <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
  988. <xsl:output
  989. {0} />
  990. <xsl:template match=""/"">
  991. <xsl:element name=""test"">
  992. <xsl:element name=""something"">
  993. <xsl:element name=""else"" />
  994. </xsl:element>
  995. </xsl:element>
  996. </xsl:template>
  997. </xsl:stylesheet>";
  998. XmlDocument xmlDoc = new XmlDocument ();
  999. xmlDoc.LoadXml ("<dummy />");
  1000. // set indent to yes
  1001. StringWriter sw = new StringWriter ();
  1002. xsltProcessor.Load (new XmlTextReader (new StringReader (
  1003. string.Format (xsltFragment, "indent=\"yes\""))),
  1004. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  1005. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  1006. Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
  1007. "<?xml version=\"1.0\" encoding=\"utf-16\"?>{0}" +
  1008. "<test>{0}" +
  1009. " <something>{0}" +
  1010. " <else />{0}" +
  1011. " </something>{0}" +
  1012. "</test>", end_of_line), sw.ToString (), "#1");
  1013. // set indent to no
  1014. sw.GetStringBuilder ().Length = 0;
  1015. xsltProcessor.Load (new XmlTextReader (new StringReader (
  1016. string.Format (xsltFragment, "indent=\"no\""))),
  1017. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  1018. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  1019. Assert.AreEqual (
  1020. "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
  1021. "<test><something><else /></something></test>", sw.ToString (),
  1022. "#2");
  1023. // indent not set
  1024. sw.GetStringBuilder ().Length = 0;
  1025. xsltProcessor.Load (new XmlTextReader (new StringReader (
  1026. string.Format (xsltFragment, ""))),
  1027. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  1028. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  1029. Assert.AreEqual (
  1030. "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
  1031. "<test><something><else /></something></test>", sw.ToString (),
  1032. "#3");
  1033. }
  1034. [Test]
  1035. public void Output_Indent_Html ()
  1036. {
  1037. XsltArgumentList xsltArgs = new XsltArgumentList ();
  1038. XslTransform xsltProcessor = new XslTransform ();
  1039. string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
  1040. <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
  1041. <xsl:output
  1042. method=""html""
  1043. {0} />
  1044. <xsl:template match=""/"">
  1045. <xsl:element name=""html"">
  1046. <xsl:element name=""body"">
  1047. <xsl:element name=""p"" />
  1048. <xsl:element name=""p"">
  1049. <xsl:text>something</xsl:text>
  1050. </xsl:element>
  1051. <xsl:element name=""p"">
  1052. <xsl:element name=""div"" />
  1053. </xsl:element>
  1054. <xsl:element name=""p"">
  1055. <xsl:element name=""whatever"" />
  1056. </xsl:element>
  1057. </xsl:element>
  1058. </xsl:element>
  1059. </xsl:template>
  1060. </xsl:stylesheet>";
  1061. XmlDocument xmlDoc = new XmlDocument ();
  1062. xmlDoc.LoadXml ("<dummy />");
  1063. // set indent to yes
  1064. StringWriter sw = new StringWriter ();
  1065. xsltProcessor.Load (new XmlTextReader (new StringReader (
  1066. string.Format (xsltFragment, "indent=\"yes\""))),
  1067. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  1068. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  1069. Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
  1070. "<html>{0}" +
  1071. " <body>{0}" +
  1072. " <p>{0}" +
  1073. " </p>{0}" +
  1074. " <p>something</p>{0}" +
  1075. " <p>{0}" +
  1076. " <div>{0}" +
  1077. " </div>{0}" +
  1078. " </p>{0}" +
  1079. " <p>{0}" +
  1080. " <whatever>{0}" +
  1081. " </whatever>{0}" +
  1082. " </p>{0}" +
  1083. " </body>{0}" +
  1084. "</html>", end_of_line), sw.ToString (), "#1");
  1085. // set indent to no
  1086. sw.GetStringBuilder ().Length = 0;
  1087. xsltProcessor.Load (new XmlTextReader (new StringReader (
  1088. string.Format (xsltFragment, "indent=\"no\""))),
  1089. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  1090. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  1091. Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
  1092. "<html><body><p></p><p>something</p><p><div></div></p>" +
  1093. "<p><whatever></whatever></p></body></html>",
  1094. Environment.NewLine), sw.ToString (), "#2");
  1095. // indent not set
  1096. sw.GetStringBuilder ().Length = 0;
  1097. xsltProcessor.Load (new XmlTextReader (new StringReader (
  1098. string.Format (xsltFragment, ""))),
  1099. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  1100. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  1101. Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
  1102. "<html>{0}" +
  1103. " <body>{0}" +
  1104. " <p>{0}" +
  1105. " </p>{0}" +
  1106. " <p>something</p>{0}" +
  1107. " <p>{0}" +
  1108. " <div>{0}" +
  1109. " </div>{0}" +
  1110. " </p>{0}" +
  1111. " <p>{0}" +
  1112. " <whatever>{0}" +
  1113. " </whatever>{0}" +
  1114. " </p>{0}" +
  1115. " </body>{0}" +
  1116. "</html>", end_of_line), sw.ToString (), "#3");
  1117. }
  1118. [Test]
  1119. [ExpectedException (typeof (XsltCompileException))]
  1120. public void Output_Indent_Invalid ()
  1121. {
  1122. string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
  1123. <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
  1124. <xsl:output indent=""Yes"" />
  1125. </xsl:stylesheet>";
  1126. XslTransform xsltProcessor = new XslTransform ();
  1127. xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
  1128. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  1129. }
  1130. [Test]
  1131. [ExpectedException (typeof (XsltCompileException))]
  1132. public void Output_Indent_Empty ()
  1133. {
  1134. string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
  1135. <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
  1136. <xsl:output indent="""" />
  1137. </xsl:stylesheet>";
  1138. XslTransform xsltProcessor = new XslTransform ();
  1139. xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
  1140. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  1141. }
  1142. [Test]
  1143. public void Output_Indent_ForwardsCompatible ()
  1144. {
  1145. StringWriter sw = new StringWriter ();
  1146. XsltArgumentList xsltArgs = new XsltArgumentList ();
  1147. XslTransform xsltProcessor = new XslTransform ();
  1148. XmlDocument xmlDoc = new XmlDocument ();
  1149. xmlDoc.LoadXml ("<dummy />");
  1150. string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
  1151. <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.5"">
  1152. <xsl:output indent=""{0}"" />
  1153. <xsl:template match=""/"">
  1154. <root />
  1155. </xsl:template>
  1156. </xsl:stylesheet>";
  1157. // indent is "Yes"
  1158. xsltProcessor.Load (new XmlTextReader (new StringReader (
  1159. string.Format (xsltFragment, "Yes"))),
  1160. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  1161. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  1162. Assert.AreEqual (
  1163. "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
  1164. "<root />", sw.ToString (), "#1");
  1165. // indent is empty
  1166. sw.GetStringBuilder ().Length = 0;
  1167. xsltProcessor.Load (new XmlTextReader (new StringReader (
  1168. string.Format (xsltFragment, ""))),
  1169. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  1170. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  1171. Assert.AreEqual (
  1172. "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
  1173. "<root />", sw.ToString (), "#2");
  1174. }
  1175. [Test]
  1176. public void Output_MediaType ()
  1177. {
  1178. StringWriter sw = null;
  1179. XsltArgumentList xsltArgs = new XsltArgumentList ();
  1180. XslTransform xsltProcessor = new XslTransform ();
  1181. string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
  1182. <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
  1183. <xsl:output media-type=""whatever"" />
  1184. <xsl:template match=""/"">
  1185. <root />
  1186. </xsl:template>
  1187. </xsl:stylesheet>";
  1188. XmlDocument xmlDoc = new XmlDocument ();
  1189. xmlDoc.LoadXml ("<dummy />");
  1190. sw = new StringWriter ();
  1191. xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
  1192. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  1193. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  1194. Assert.AreEqual (
  1195. "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
  1196. "<root />", sw.ToString ());
  1197. }
  1198. [Test]
  1199. public void Output_Encoding_TextWriter ()
  1200. {
  1201. StringWriter sw = null;
  1202. XsltArgumentList xsltArgs = new XsltArgumentList ();
  1203. XslTransform xsltProcessor = new XslTransform ();
  1204. string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
  1205. <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
  1206. <xsl:output {0} />
  1207. <xsl:template match=""/"">
  1208. <root />
  1209. </xsl:template>
  1210. </xsl:stylesheet>";
  1211. XmlDocument xmlDoc = new XmlDocument ();
  1212. xmlDoc.LoadXml ("<dummy />");
  1213. // no encoding
  1214. sw = new StringWriter ();
  1215. xsltProcessor.Load (new XmlTextReader (new StringReader (
  1216. string.Format (xsltFragment, string.Empty))),
  1217. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  1218. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  1219. Assert.AreEqual (
  1220. "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
  1221. "<root />", sw.ToString (), "#1");
  1222. // valid encoding
  1223. sw.GetStringBuilder ().Length = 0;
  1224. xsltProcessor.Load (new XmlTextReader (new StringReader (
  1225. string.Format(xsltFragment, "encoding=\"iso-8859-1\""))),
  1226. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  1227. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  1228. Assert.AreEqual (
  1229. "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
  1230. "<root />", sw.ToString (), "#1");
  1231. // invalid encoding
  1232. sw.GetStringBuilder ().Length = 0;
  1233. xsltProcessor.Load (new XmlTextReader (new StringReader (
  1234. string.Format (xsltFragment, "encoding=\"doesnotexist\""))),
  1235. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  1236. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  1237. Assert.AreEqual (
  1238. "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
  1239. "<root />", sw.ToString (), "#2");
  1240. // empty encoding
  1241. sw.GetStringBuilder ().Length = 0;
  1242. xsltProcessor.Load (new XmlTextReader (new StringReader (
  1243. string.Format (xsltFragment, "encoding=\"\""))),
  1244. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  1245. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  1246. Assert.AreEqual (
  1247. "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
  1248. "<root />", sw.ToString (), "#3");
  1249. }
  1250. [Test]
  1251. public void Output_Encoding_Stream ()
  1252. {
  1253. MemoryStream ms = null;
  1254. string result = null;
  1255. XsltArgumentList xsltArgs = new XsltArgumentList ();
  1256. XslTransform xsltProcessor = new XslTransform ();
  1257. string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
  1258. <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
  1259. <xsl:output {0} />
  1260. <xsl:template match=""/"">
  1261. <root />
  1262. </xsl:template>
  1263. </xsl:stylesheet>";
  1264. XmlDocument xmlDoc = new XmlDocument ();
  1265. xmlDoc.LoadXml ("<dummy />");
  1266. // no encoding
  1267. ms = new MemoryStream ();
  1268. xsltProcessor.Load (new XmlTextReader (new StringReader (
  1269. string.Format (xsltFragment, string.Empty))),
  1270. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  1271. xsltProcessor.Transform (xmlDoc, xsltArgs, ms, new XmlUrlResolver ());
  1272. ms.Position = 0;
  1273. using (StreamReader sr = new StreamReader (ms, true)) {
  1274. result = sr.ReadToEnd ();
  1275. }
  1276. Assert.AreEqual (
  1277. "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
  1278. "<root />", result, "#1");
  1279. // valid encoding
  1280. ms = new MemoryStream ();
  1281. xsltProcessor.Load (new XmlTextReader (new StringReader (
  1282. string.Format (xsltFragment, "encoding=\"iso-8859-1\""))),
  1283. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  1284. xsltProcessor.Transform (xmlDoc, xsltArgs, ms, new XmlUrlResolver ());
  1285. ms.Position = 0;
  1286. using (StreamReader sr = new StreamReader (ms, true)) {
  1287. result = sr.ReadToEnd ();
  1288. }
  1289. Assert.AreEqual (
  1290. "<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>" +
  1291. "<root />", result, "#2");
  1292. // invalid encoding
  1293. ms = new MemoryStream ();
  1294. xsltProcessor.Load (new XmlTextReader (new StringReader (
  1295. string.Format (xsltFragment, "encoding=\"doesnotexist\""))),
  1296. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  1297. xsltProcessor.Transform (xmlDoc, xsltArgs, ms, new XmlUrlResolver ());
  1298. ms.Position = 0;
  1299. using (StreamReader sr = new StreamReader (ms, true)) {
  1300. result = sr.ReadToEnd ();
  1301. }
  1302. Assert.AreEqual (
  1303. "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
  1304. "<root />", result, "#3");
  1305. // empty encoding
  1306. ms = new MemoryStream ();
  1307. xsltProcessor.Load (new XmlTextReader (new StringReader (
  1308. string.Format (xsltFragment, "encoding=\"\""))),
  1309. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  1310. xsltProcessor.Transform (xmlDoc, xsltArgs, ms, new XmlUrlResolver ());
  1311. ms.Position = 0;
  1312. using (StreamReader sr = new StreamReader (ms, true)) {
  1313. result = sr.ReadToEnd ();
  1314. }
  1315. Assert.AreEqual (
  1316. "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
  1317. "<root />", result, "#4");
  1318. }
  1319. [Test]
  1320. public void Output_Version ()
  1321. {
  1322. StringWriter sw = null;
  1323. XsltArgumentList xsltArgs = new XsltArgumentList ();
  1324. XslTransform xsltProcessor = new XslTransform ();
  1325. string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
  1326. <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
  1327. <xsl:output version=""{0}"" />
  1328. <xsl:template match=""/"">
  1329. <root />
  1330. </xsl:template>
  1331. </xsl:stylesheet>";
  1332. XmlDocument xmlDoc = new XmlDocument ();
  1333. xmlDoc.LoadXml ("<dummy />");
  1334. // version 1.0
  1335. sw = new StringWriter ();
  1336. xsltProcessor.Load (new XmlTextReader (new StringReader (
  1337. string.Format (xsltFragment, "1.0"))),
  1338. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  1339. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  1340. Assert.AreEqual (
  1341. "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
  1342. "<root />", sw.ToString (), "#1");
  1343. // version 2.0
  1344. sw.GetStringBuilder ().Length = 0;
  1345. xsltProcessor.Load (new XmlTextReader (new StringReader (
  1346. string.Format (xsltFragment, "2.0"))),
  1347. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  1348. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  1349. Assert.AreEqual (
  1350. "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
  1351. "<root />", sw.ToString (), "#2");
  1352. // version BLABLA
  1353. sw.GetStringBuilder ().Length = 0;
  1354. xsltProcessor.Load (new XmlTextReader (new StringReader (
  1355. string.Format (xsltFragment, "BLABLA"))),
  1356. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  1357. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  1358. Assert.AreEqual (
  1359. "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
  1360. "<root />", sw.ToString (), "#3");
  1361. }
  1362. [Test]
  1363. public void Output_Method_Html_TextWriter ()
  1364. {
  1365. string options = null;
  1366. StringWriter sw = null;
  1367. XsltArgumentList xsltArgs = new XsltArgumentList ();
  1368. XslTransform xsltProcessor = new XslTransform ();
  1369. string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
  1370. <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
  1371. <xsl:output method=""html"" {0} />
  1372. <xsl:template match=""/"">
  1373. <xsl:element name=""html"">
  1374. <xsl:element name=""head"">
  1375. <xsl:element name=""title"">Output Test</xsl:element>
  1376. </xsl:element>
  1377. <xsl:element name=""Body"">
  1378. <xsl:element name=""BR"" />
  1379. </xsl:element>
  1380. </xsl:element>
  1381. </xsl:template>
  1382. </xsl:stylesheet>";
  1383. XmlDocument xmlDoc = new XmlDocument ();
  1384. xmlDoc.LoadXml ("<dummy />");
  1385. // indent not set, media-type not set
  1386. sw = new StringWriter ();
  1387. xsltProcessor.Load (new XmlTextReader (new StringReader (
  1388. string.Format (xsltFragment, string.Empty))),
  1389. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  1390. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  1391. Assert.AreEqual (string.Format(CultureInfo.InvariantCulture,
  1392. "<html>{0}" +
  1393. "{1}<head>{0}" +
  1394. "{1}{1}<META http-equiv=\"Content-Type\" content=\"text/html; charset=utf-16\">{0}" +
  1395. "{1}{1}<title>Output Test</title>{0}" +
  1396. "{1}</head>{0}" +
  1397. "{1}<Body>{0}" +
  1398. "{1}{1}<BR>{0}" +
  1399. "{1}</Body>{0}" +
  1400. "</html>", end_of_line, " "), sw.ToString (), "#1");
  1401. // indent no, media-type not set
  1402. options = "indent=\"no\"";
  1403. sw.GetStringBuilder ().Length = 0;
  1404. xsltProcessor.Load (new XmlTextReader (new StringReader (
  1405. string.Format (xsltFragment, options))),
  1406. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  1407. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  1408. Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
  1409. "<html>{0}" +
  1410. "{1}<head>{0}" +
  1411. "{1}{1}<META http-equiv=\"Content-Type\" content=\"text/html; charset=utf-16\">{0}" +
  1412. "{1}{1}<title>Output Test</title>{0}" +
  1413. "{1}</head>{0}" +
  1414. "{1}<Body>{0}" +
  1415. "{1}{1}<BR>{0}" +
  1416. "{1}</Body>{0}" +
  1417. "</html>", string.Empty, string.Empty), sw.ToString (), "#2");
  1418. // indent yes, media-type "bla", omit-xml-declaration "no"
  1419. options = "indent=\"yes\" media-type=\"bla\"" +
  1420. " encoding=\"iso-8859-1\" omit-xml-declaration=\"no\"";
  1421. sw.GetStringBuilder ().Length = 0;
  1422. xsltProcessor.Load (new XmlTextReader (new StringReader (
  1423. string.Format (xsltFragment, options))),
  1424. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  1425. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  1426. Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
  1427. "<html>{0}" +
  1428. "{1}<head>{0}" +
  1429. "{1}{1}<META http-equiv=\"Content-Type\" content=\"bla; charset=utf-16\">{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>", end_of_line, " "), sw.ToString (), "#3");
  1436. }
  1437. [Test]
  1438. public void Output_Method_Html_Stream ()
  1439. {
  1440. string options = null;
  1441. MemoryStream ms = null;
  1442. string result = null;
  1443. XsltArgumentList xsltArgs = new XsltArgumentList ();
  1444. XslTransform xsltProcessor = new XslTransform ();
  1445. string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
  1446. <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
  1447. <xsl:output method=""html"" {0} />
  1448. <xsl:template match=""/"">
  1449. <xsl:element name=""html"">
  1450. <xsl:element name=""head"">
  1451. <xsl:element name=""title"">Output Test</xsl:element>
  1452. </xsl:element>
  1453. <xsl:element name=""Body"">
  1454. <xsl:element name=""BR"" />
  1455. </xsl:element>
  1456. </xsl:element>
  1457. </xsl:template>
  1458. </xsl:stylesheet>";
  1459. XmlDocument xmlDoc = new XmlDocument ();
  1460. xmlDoc.LoadXml ("<dummy />");
  1461. // indent not set, media-type not set
  1462. ms = new MemoryStream ();
  1463. xsltProcessor.Load (new XmlTextReader (new StringReader (
  1464. string.Format (xsltFragment, string.Empty))),
  1465. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  1466. xsltProcessor.Transform (xmlDoc, xsltArgs, ms, new XmlUrlResolver ());
  1467. ms.Position = 0;
  1468. using (StreamReader sr = new StreamReader (ms, true)) {
  1469. result = sr.ReadToEnd ();
  1470. }
  1471. Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
  1472. "<html>{0}" +
  1473. "{1}<head>{0}" +
  1474. "{1}{1}<META http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">{0}" +
  1475. "{1}{1}<title>Output Test</title>{0}" +
  1476. "{1}</head>{0}" +
  1477. "{1}<Body>{0}" +
  1478. "{1}{1}<BR>{0}" +
  1479. "{1}</Body>{0}" +
  1480. "</html>", end_of_line, " "), result, "#1");
  1481. // indent no, media-type not set
  1482. options = "indent=\"no\"";
  1483. ms = new MemoryStream ();
  1484. xsltProcessor.Load (new XmlTextReader (new StringReader (
  1485. string.Format (xsltFragment, options))),
  1486. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  1487. xsltProcessor.Transform (xmlDoc, xsltArgs, ms, new XmlUrlResolver ());
  1488. ms.Position = 0;
  1489. using (StreamReader sr = new StreamReader (ms, true)) {
  1490. result = sr.ReadToEnd ();
  1491. }
  1492. Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
  1493. "<html>{0}" +
  1494. "{1}<head>{0}" +
  1495. "{1}{1}<META http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">{0}" +
  1496. "{1}{1}<title>Output Test</title>{0}" +
  1497. "{1}</head>{0}" +
  1498. "{1}<Body>{0}" +
  1499. "{1}{1}<BR>{0}" +
  1500. "{1}</Body>{0}" +
  1501. "</html>", string.Empty, string.Empty), result, "#2");
  1502. // indent yes, media-type "bla", omit-xml-declaration "no"
  1503. options = "indent=\"yes\" media-type=\"bla\"" +
  1504. " encoding=\"iso-8859-1\" omit-xml-declaration=\"no\"";
  1505. ms = new MemoryStream ();
  1506. xsltProcessor.Load (new XmlTextReader (new StringReader (
  1507. string.Format (xsltFragment, options))),
  1508. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  1509. xsltProcessor.Transform (xmlDoc, xsltArgs, ms, new XmlUrlResolver ());
  1510. ms.Position = 0;
  1511. using (StreamReader sr = new StreamReader (ms, true)) {
  1512. result = sr.ReadToEnd ();
  1513. }
  1514. Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
  1515. "<html>{0}" +
  1516. "{1}<head>{0}" +
  1517. "{1}{1}<META http-equiv=\"Content-Type\" content=\"bla; charset=iso-8859-1\">{0}" +
  1518. "{1}{1}<title>Output Test</title>{0}" +
  1519. "{1}</head>{0}" +
  1520. "{1}<Body>{0}" +
  1521. "{1}{1}<BR>{0}" +
  1522. "{1}</Body>{0}" +
  1523. "</html>", end_of_line, " "), result, "#3");
  1524. }
  1525. [Test]
  1526. [ExpectedException (typeof (XsltCompileException))]
  1527. public void Output_Unknown_Attribute ()
  1528. {
  1529. string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
  1530. <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
  1531. <xsl:output whatever="""" />
  1532. </xsl:stylesheet>";
  1533. XslTransform xsltProcessor = new XslTransform ();
  1534. xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
  1535. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  1536. }
  1537. [Test]
  1538. public void Output_Unknown_Attribute_ForwardsCompatible ()
  1539. {
  1540. StringWriter sw = new StringWriter ();
  1541. XsltArgumentList xsltArgs = new XsltArgumentList ();
  1542. XslTransform xsltProcessor = new XslTransform ();
  1543. XmlDocument xmlDoc = new XmlDocument ();
  1544. xmlDoc.LoadXml ("<dummy />");
  1545. string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
  1546. <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.5"">
  1547. <xsl:output whatever="""" />
  1548. <xsl:template match=""/"">
  1549. <root />
  1550. </xsl:template>
  1551. </xsl:stylesheet>";
  1552. xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
  1553. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  1554. xsltProcessor.Transform (xmlDoc, xsltArgs, sw, new XmlUrlResolver ());
  1555. Assert.AreEqual (
  1556. "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
  1557. "<root />", sw.ToString (), "#1");
  1558. }
  1559. [Test]
  1560. public void Output_Unknown_Attribute_NonDefaultNamespace ()
  1561. {
  1562. string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
  1563. <xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" xmlns:tst=""something"" version=""1.0"">
  1564. <xsl:output tst:whatever="""" />
  1565. </xsl:stylesheet>";
  1566. XslTransform xsltProcessor = new XslTransform ();
  1567. xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
  1568. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  1569. }
  1570. // http://support.microsoft.com/kb/832757/en-us
  1571. [Test]
  1572. public void FormatNumber_KB_832757 ()
  1573. {
  1574. string xsltFragment = @"<?xml version=""1.0"" encoding=""UTF-8""?>
  1575. <xsl:stylesheet version=""1.0"" xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"">
  1576. <xsl:output method=""xml"" version=""1.0"" encoding=""UTF-8"" indent=""yes"" />
  1577. <xsl:template match=""/"">
  1578. <table>
  1579. <xsl:apply-templates />
  1580. </table>
  1581. </xsl:template>
  1582. <xsl:template match=""number"">
  1583. <tr><td><xsl:value-of select=""format-number(.,'#,##0;(#,##0)')""/></td></tr>
  1584. </xsl:template>
  1585. </xsl:stylesheet>";
  1586. XmlDocument xmlDoc = new XmlDocument ();
  1587. xmlDoc.LoadXml ("<root><number>1000</number></root>");
  1588. StringWriter sw = new StringWriter ();
  1589. XslTransform xsltProcessor = new XslTransform ();
  1590. xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
  1591. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  1592. xsltProcessor.Transform (xmlDoc, new XsltArgumentList (), sw,
  1593. new XmlUrlResolver ());
  1594. Assert.AreEqual (string.Format(CultureInfo.InvariantCulture,
  1595. "<?xml version=\"1.0\" encoding=\"utf-16\"?>{0}" +
  1596. "<table>{0}" +
  1597. " <tr>{0}" +
  1598. " <td>1,000</td>{0}" +
  1599. " </tr>{0}" +
  1600. "</table>", end_of_line), sw.ToString ());
  1601. }
  1602. // http://support.microsoft.com/kb/293469/en-us
  1603. [Test]
  1604. public void FormatNumber_KB_293469 ()
  1605. {
  1606. string xsltFragment = @"<?xml version=""1.0""?>
  1607. <xsl:stylesheet version=""1.0"" xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"">
  1608. <xsl:output method=""xml"" indent=""yes"" />
  1609. <xsl:decimal-format name=""european"" decimal-separator="","" grouping-separator=""."" />
  1610. <xsl:template match=""/"">
  1611. <xsl:element name=""html"">
  1612. <xsl:element name=""body"">
  1613. <xsl:apply-templates select=""root/amount"" />
  1614. </xsl:element>
  1615. </xsl:element>
  1616. </xsl:template>
  1617. <xsl:template match=""amount"">
  1618. <xsl:value-of select=""format-number(., '###.###,00', 'european')""/>
  1619. </xsl:template>
  1620. </xsl:stylesheet>";
  1621. XmlDocument xmlDoc = new XmlDocument ();
  1622. xmlDoc.LoadXml ("<root><amount currency='USD'>44442.7</amount></root>");
  1623. StringWriter sw = new StringWriter ();
  1624. XslTransform xsltProcessor = new XslTransform ();
  1625. xsltProcessor.Load (new XmlTextReader (new StringReader (xsltFragment)),
  1626. new XmlUrlResolver (), AppDomain.CurrentDomain.Evidence);
  1627. xsltProcessor.Transform (xmlDoc, new XsltArgumentList (), sw,
  1628. new XmlUrlResolver ());
  1629. Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
  1630. "<?xml version=\"1.0\" encoding=\"utf-16\"?>{0}" +
  1631. "<html>{0}" +
  1632. " <body>44.442,70</body>{0}" +
  1633. "</html>", end_of_line), sw.ToString ());
  1634. }
  1635. [Test]
  1636. [Category ("NotDotNet")]
  1637. // MS bug: the output must be well-formed XML general entity
  1638. // (doctype must not appear after text nodes).
  1639. public void DocTypeAfterText ()
  1640. {
  1641. string xsl = @"
  1642. <xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
  1643. <xsl:output doctype-system='system'/>
  1644. <xsl:template match='/'>
  1645. <xsl:text xml:space='preserve'> a </xsl:text>
  1646. <foo/>
  1647. </xsl:template>
  1648. </xsl:stylesheet>";
  1649. XslTransform t = new XslTransform ();
  1650. t.Load (new XmlTextReader (xsl, XmlNodeType.Document, null));
  1651. XmlDocument doc = new XmlDocument ();
  1652. try {
  1653. t.Transform (new XPathDocument (
  1654. new StringReader ("<root/>")),
  1655. null, TextWriter.Null);
  1656. Assert.Fail ("should fail; doctype is not allowed after whitespace. See XSLT 1.0 section 16.1.");
  1657. } catch {
  1658. }
  1659. }
  1660. [Test]
  1661. public void StripSpace ()
  1662. {
  1663. string result = @"
  1664. MonoDevelop
  1665. ProjectTemplates
  1666. FileTemplates
  1667. IDE
  1668. StartupHandlers
  1669. FileTemplateTypes
  1670. Workspace
  1671. Applications
  1672. Services
  1673. ";
  1674. XslTransform t = new XslTransform ();
  1675. t.Load (TestResourceHelper.GetFullPathOfResource ("Test/XmlFiles/xsl/stripspace.xsl"));
  1676. XPathDocument d = new XPathDocument (
  1677. TestResourceHelper.GetFullPathOfResource ("Test/XmlFiles/xsl/stripspace.xml"), XmlSpace.Preserve);
  1678. StringWriter sw = new StringWriter ();
  1679. t.Transform (d, null, sw);
  1680. Assert.AreEqual (result, sw.ToString ());
  1681. }
  1682. [Test]
  1683. public void CurrentInSelect ()
  1684. {
  1685. XslTransform t = new XslTransform ();
  1686. t.Load (TestResourceHelper.GetFullPathOfResource ("Test/XmlFiles/xsl/current-in-select.xsl"));
  1687. XPathDocument d = new XPathDocument (
  1688. TestResourceHelper.GetFullPathOfResource ("Test/XmlFiles/xsl/current-in-select.xml"), XmlSpace.Preserve);
  1689. StringWriter sw = new StringWriter ();
  1690. t.Transform (d, null, sw);
  1691. using (StreamReader sr = File.OpenText (
  1692. TestResourceHelper.GetFullPathOfResource ("Test/XmlFiles/xsl/current-in-select.ref"))) {
  1693. string s = sr.ReadToEnd ();
  1694. Assert.AreEqual (s, sw.ToString ());
  1695. }
  1696. }
  1697. [Test]
  1698. public void CallTemplateSignificantWhitespace ()
  1699. {
  1700. // bug #82357
  1701. string xsl = @"<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
  1702. <xsl:template name='foo' xml:space='preserve'>
  1703. <xsl:call-template name='bar'>
  1704. <xsl:with-param name='hoge' select='hoge' />
  1705. </xsl:call-template>
  1706. </xsl:template>
  1707. <xsl:template name='bar'>
  1708. </xsl:template>
  1709. </xsl:stylesheet>";
  1710. XslTransform t = new XslTransform ();
  1711. t.Load (new XmlTextReader (new StringReader (xsl)));
  1712. t.Transform (new XPathDocument (new StringReader ("<dummy/>")), null, new XmlTextWriter (TextWriter.Null));
  1713. }
  1714. [Test]
  1715. public void Bug82493 ()
  1716. {
  1717. XslTransform transformationObj = new XslTransform ();
  1718. transformationObj.Load (TestResourceHelper.GetFullPathOfResource ("Test/XmlFiles/xsl/82493.xsl"));
  1719. XmlDocument doc = new XmlDocument ();
  1720. doc.Load (TestResourceHelper.GetFullPathOfResource ("Test/XmlFiles/xsl/82493.xml"));
  1721. XslExtensionClass GetCalculation = new XslExtensionClass ("a4");
  1722. XsltArgumentList xslExtensionArgList = new XsltArgumentList ();
  1723. xslExtensionArgList.AddExtensionObject ("urn:e", GetCalculation);
  1724. XmlTextWriter writer = new XmlTextWriter (TextWriter.Null);
  1725. transformationObj.Transform (doc, xslExtensionArgList, writer, null);
  1726. }
  1727. [Test]
  1728. public void BugNovell325482 ()
  1729. {
  1730. XmlDocument doc = new XmlDocument ();
  1731. doc.Load (TestResourceHelper.GetFullPathOfResource ("Test/XmlFiles/xsl/325482.xml"));
  1732. XslTransform xt = new XslTransform ();
  1733. xt.Load (TestResourceHelper.GetFullPathOfResource ("Test/XmlFiles/xsl/325482.xsl"));
  1734. xt.Transform (doc, null, TextWriter.Null);
  1735. }
  1736. public class XslExtensionClass
  1737. {
  1738. private string paperType = String.Empty;
  1739. public XslExtensionClass (string paperType)
  1740. {
  1741. this.paperType = paperType;
  1742. }
  1743. public int GetPageDimensions ()
  1744. {
  1745. switch (this.paperType) {
  1746. case "a4":
  1747. return 210297;
  1748. case "letter":
  1749. return 216279;
  1750. default:
  1751. throw new ArgumentException ("Unknown page size type: " + this.paperType);
  1752. }
  1753. }
  1754. }
  1755. [Test] // bug #348786
  1756. public void ValueOfContainsExternalElements ()
  1757. {
  1758. string xsl = @"
  1759. <xsl:stylesheet version=""1.0"" xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"">
  1760. <xsl:template match=""x"">
  1761. <y>
  1762. <xsl:value-of select=""@bar"">
  1763. <!-- enter comment here -->
  1764. </xsl:value-of>
  1765. </y>
  1766. </xsl:template>
  1767. </xsl:stylesheet>";
  1768. new XslTransform ().Load (new XmlTextReader (xsl, XmlNodeType.Document, null));
  1769. }
  1770. [Test] // bug #349035
  1771. public void CompareRTFAsStringNotNodeset ()
  1772. {
  1773. XslTransform xslt = new XslTransform ();
  1774. xslt.Load (new XmlTextReader (new StringReader (@"
  1775. <xsl:stylesheet version=""1.0""
  1776. xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"">
  1777. <xsl:template name=""foo"">
  1778. <xsl:param name=""bar""/>
  1779. <xsl:if test=""$bar!=''"">
  1780. <bar>bar is not empty:'<xsl:value-of select=""$bar""/>'</bar>
  1781. </xsl:if>
  1782. <xsl:if test=""$bar=''"">
  1783. <bar>bar is empty</bar>
  1784. </xsl:if>
  1785. </xsl:template>
  1786. <xsl:template match=""zap"">
  1787. <xsl:call-template name=""foo"">
  1788. <xsl:with-param name=""bar"">
  1789. <xsl:for-each select=""@bar"">
  1790. <xsl:value-of select="".""/>
  1791. </xsl:for-each>
  1792. </xsl:with-param>
  1793. </xsl:call-template>
  1794. </xsl:template>
  1795. </xsl:stylesheet>"
  1796. )));
  1797. XPathDocument input = new XPathDocument (new StringReader (
  1798. @"<root>
  1799. <zap bar=""HaHa""/>
  1800. <zap/>
  1801. </root>"
  1802. ));
  1803. StringWriter sw = new StringWriter ();
  1804. XmlTextWriter xtw = new XmlTextWriter (sw);
  1805. xslt.Transform (input, null, xtw);
  1806. string expected = "<bar>bar is not empty:'HaHa'</bar><bar>bar is empty</bar>";
  1807. Assert.AreEqual (expected, sw.ToString ());
  1808. }
  1809. [Test]
  1810. public void Bug349111 ()
  1811. {
  1812. XslTransform xslt = new XslTransform ();
  1813. xslt.Load (new XmlTextReader (new StringReader (@"
  1814. <xsl:stylesheet version=""1.0"" xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"">
  1815. <xsl:template match=""book"">
  1816. <xsl:for-each select=""child::node()[position()]"">
  1817. <yyy>
  1818. <xsl:value-of select="".""/>
  1819. </yyy>
  1820. </xsl:for-each>
  1821. </xsl:template>
  1822. </xsl:stylesheet>"
  1823. )));
  1824. XPathDocument input = new XPathDocument (new StringReader (@"
  1825. <bookstore>
  1826. <book> <title lang=""eng"">Harry Potter</title> <price>29.99</price> </book>
  1827. </bookstore>"
  1828. ));
  1829. StringWriter sw = new StringWriter ();
  1830. xslt.Transform (input, null, new XmlTextWriter (sw));
  1831. string expected = "<yyy>Harry Potter</yyy><yyy>29.99</yyy>";
  1832. Assert.AreEqual (expected, sw.ToString ());
  1833. }
  1834. [Test]
  1835. public void Bug351939 ()
  1836. {
  1837. XslTransform xslt = new XslTransform ();
  1838. xslt.Load (new XmlTextReader (new StringReader (
  1839. @"<xsl:stylesheet version=""1.0""
  1840. xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"">
  1841. <xsl:key name=""thekey"" match=""aa"" use=""''""/>
  1842. <xsl:key name=""thekey"" match=""ab"" use=""''""/>
  1843. <xsl:template match=""root"">
  1844. <x>
  1845. <foo><xsl:value-of select=""key('thekey','')[1]""/></foo>
  1846. <bar><xsl:value-of select=""key('thekey','')[2]""/></bar>
  1847. <baz><xsl:value-of select=""key('thekey','')[3]""/></baz>
  1848. <tem><xsl:value-of select=""key('thekey','')[4]""/></tem>
  1849. </x>
  1850. </xsl:template>
  1851. </xsl:stylesheet>")));
  1852. StringWriter sw = new StringWriter ();
  1853. xslt.Transform (new XPathDocument (new StringReader (
  1854. @"<?xml version=""1.0""?>
  1855. <root>
  1856. <a>
  1857. <aa>1</aa>
  1858. <ab>2</ab>
  1859. </a>
  1860. <a>
  1861. <aa>3</aa>
  1862. <ab>4</ab>
  1863. </a>
  1864. </root>")), null, new XmlTextWriter (sw));
  1865. Assert.AreEqual ("<x><foo>1</foo><bar>2</bar><baz>3</baz><tem>4</tem></x>", sw.ToString ());
  1866. }
  1867. [Test]
  1868. public void CopyOfIXPathNavigable ()
  1869. {
  1870. string xsl = @"
  1871. <xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'
  1872. xmlns:foo='urn:Foo'>
  1873. <xsl:template match='/'>
  1874. <xsl:copy-of select='foo:MyCustomFunction()'/>
  1875. </xsl:template>
  1876. </xsl:stylesheet>";
  1877. string xml = @"
  1878. <family>
  1879. <person>
  1880. <given-name age='10'>
  1881. <name>Fred</name>
  1882. <nick-name>Freddy</nick-name>
  1883. </given-name>
  1884. <family-name>Smith</family-name>
  1885. </person>
  1886. <person>
  1887. <given-name age='10'>
  1888. <name>Robert</name>
  1889. <nick-name>Bob</nick-name>
  1890. </given-name>
  1891. <family-name>Smith</family-name>
  1892. </person>
  1893. </family>";
  1894. XslTransform t = new XslTransform ();
  1895. t.Load (new XPathDocument (new StringReader (xsl)));
  1896. XsltArgumentList args = new XsltArgumentList();
  1897. args.AddExtensionObject ("urn:Foo", new CopyOfIXPathNavigableClass ());
  1898. StringWriter sw = new StringWriter ();
  1899. t.Transform (new XPathDocument (new StringReader (xml)), args, new XmlTextWriter (sw));
  1900. Assert.AreEqual ("<root><child0 /><child1 /></root>", sw.ToString ());
  1901. }
  1902. public class CopyOfIXPathNavigableClass
  1903. {
  1904. public object MyCustomFunction ()
  1905. {
  1906. XmlDocument doc = new XmlDocument ();
  1907. doc .LoadXml ("<root><child0 /><child1 /></root>");
  1908. return doc.DocumentElement;
  1909. }
  1910. }
  1911. [Test] // bug #316238
  1912. public void ResolveVariableInXsltArgumentList ()
  1913. {
  1914. ResolveVariableInXsltArgumentList (TestResourceHelper.GetFullPathOfResource ("Test/XmlFiles/xsl/316238-1.xsl"));
  1915. ResolveVariableInXsltArgumentList (TestResourceHelper.GetFullPathOfResource ("Test/XmlFiles/xsl/316238-2.xsl"));
  1916. }
  1917. void ResolveVariableInXsltArgumentList (string file)
  1918. {
  1919. XmlDocument doc = new XmlDocument ();
  1920. doc.LoadXml ("<doc><element id=\"test\">this is a test</element></doc>");
  1921. XslTransform transform = new XslTransform ();
  1922. transform.Load (file);
  1923. //Stream outputStream = Console.OpenStandardOutput();
  1924. XsltArgumentList xsltArgs = new XsltArgumentList ();
  1925. xsltArgs.AddParam ("test", "", "test");
  1926. xsltArgs.AddParam ("doc", "", doc.CreateNavigator().Select ("*"));
  1927. transform.Transform (new XmlDocument (), xsltArgs, TextWriter.Null);
  1928. }
  1929. [Test] // bug #378239
  1930. public void WhitespaceEntityInStylesheet ()
  1931. {
  1932. string xslt = @"<?xml version='1.0' encoding='UTF-8'?>
  1933. <!DOCTYPE xsl:stylesheet [
  1934. <!ENTITY nl '
  1935. '>
  1936. ]>
  1937. <xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'>
  1938. <xsl:output method='text' omit-xml-declaration='yes'/>
  1939. <xsl:template match='/'>
  1940. <xsl:text>&nl;Hello&nl;World</xsl:text>
  1941. </xsl:template>
  1942. </xsl:stylesheet>";
  1943. string expected = @"
  1944. Hello
  1945. World";
  1946. XslTransform t = new XslTransform ();
  1947. t.Load (new XPathDocument (new StringReader (xslt)));
  1948. StringWriter sw = new StringWriter ();
  1949. t.Transform (new XPathDocument (new StringReader ("<test/>")), null, sw);
  1950. Assert.AreEqual (expected, sw.ToString ());
  1951. }
  1952. [Test] // bug #556619
  1953. public void RejectCurrencySymbolAsNumber ()
  1954. {
  1955. XslTransform xslt = new XslTransform ();
  1956. StringWriter sw = new StringWriter ();
  1957. string s =
  1958. @"<?xml version=""1.0""?>
  1959. <xsl:stylesheet
  1960. version=""1.0""
  1961. xmlns:xsl=""http://www.w3.org/1999/XSL/Transform""
  1962. >
  1963. <xsl:template name=""F"">
  1964. <xsl:param name=""p""/>
  1965. <xsl:choose>
  1966. <xsl:when test=""number($p)"">
  1967. YES <xsl:value-of select=""number($p)""/>
  1968. </xsl:when>
  1969. <xsl:otherwise>
  1970. NO
  1971. </xsl:otherwise>
  1972. </xsl:choose>
  1973. </xsl:template>
  1974. <xsl:template match=""/"">
  1975. <xsl:call-template name=""F"">
  1976. <xsl:with-param name=""p"">$4$2</xsl:with-param>
  1977. </xsl:call-template>
  1978. </xsl:template>
  1979. </xsl:stylesheet>";
  1980. xslt.Load (new XmlTextReader (new StringReader (s)));
  1981. xslt.Transform (new XPathDocument (new StringReader (
  1982. @"<?xml version=""1.0""?>
  1983. <root>
  1984. </root>")), null, sw);
  1985. Assert.IsTrue (sw.ToString ().IndexOf ("NO") > 0);
  1986. }
  1987. [Test] // bug #349375
  1988. public void PreserveWhitespace ()
  1989. {
  1990. XslCompiledTransform xslt = new XslCompiledTransform ();
  1991. xslt.Load (new XmlTextReader (new StringReader (@"
  1992. <xsl:stylesheet
  1993. version=""1.0""
  1994. xmlns:xsl=""http://www.w3.org/1999/XSL/Transform""
  1995. >
  1996. <xsl:output omit-xml-declaration='yes' />
  1997. <xsl:strip-space elements='*'/>
  1998. <xsl:preserve-space elements='p span'/>
  1999. <xsl:template name='foo'>
  2000. <xsl:for-each select='node()'>
  2001. <xsl:attribute name='yes-one-node'/>
  2002. <xsl:value-of select='.'/>
  2003. </xsl:for-each>
  2004. <xsl:if test='not(node())'>
  2005. <xsl:attribute name='not-node'/>
  2006. <xsl:value-of select='.'/>
  2007. </xsl:if>
  2008. </xsl:template>
  2009. <xsl:template match='p'>
  2010. <y>
  2011. <xsl:for-each select='child::node()[position()]'>
  2012. <xsl:choose>
  2013. <xsl:when test='name()=""span""'>
  2014. <t>
  2015. <xsl:call-template name='foo'/>
  2016. </t>
  2017. </xsl:when>
  2018. </xsl:choose>
  2019. </xsl:for-each>
  2020. </y>
  2021. </xsl:template>
  2022. </xsl:stylesheet>")));
  2023. StringWriter sw = new StringWriter ();
  2024. xslt.Transform (new XmlTextReader (new StringReader (@"
  2025. <root>
  2026. <l0>
  2027. <p>
  2028. <span>1</span>
  2029. <span> </span>
  2030. </p>
  2031. </l0>
  2032. </root>")), null, sw);
  2033. Assert.AreEqual (@"<y><t yes-one-node="""">1</t><t yes-one-node=""""> </t></y>", sw.ToString ());
  2034. }
  2035. [Test] // reverse case of #349375
  2036. [Category ("MobileNotWorking")]
  2037. public void PreserveWhitespace2 ()
  2038. {
  2039. XslCompiledTransform xslt = new XslCompiledTransform ();
  2040. xslt.Load (new XmlTextReader (new StringReader (@"
  2041. <xsl:stylesheet
  2042. version=""1.0""
  2043. xmlns:xsl=""http://www.w3.org/1999/XSL/Transform""
  2044. >
  2045. <xsl:output omit-xml-declaration='yes' />
  2046. <xsl:preserve-space elements='*'/>
  2047. <xsl:strip-space elements='p span'/>
  2048. <xsl:template name='foo'>
  2049. <xsl:for-each select='node()'>
  2050. <xsl:attribute name='yes-one-node'/>
  2051. <xsl:value-of select='.'/>
  2052. </xsl:for-each>
  2053. <xsl:if test='not(node())'>
  2054. <xsl:attribute name='not-node'/>
  2055. <xsl:value-of select='.'/>
  2056. </xsl:if>
  2057. </xsl:template>
  2058. <xsl:template match='p'>
  2059. <y>
  2060. <xsl:for-each select='child::node()[position()]'>
  2061. <xsl:choose>
  2062. <xsl:when test='name()=""span""'>
  2063. <t>
  2064. <xsl:call-template name='foo'/>
  2065. </t>
  2066. </xsl:when>
  2067. </xsl:choose>
  2068. </xsl:for-each>
  2069. </y>
  2070. </xsl:template>
  2071. </xsl:stylesheet>")));
  2072. StringWriter sw = new StringWriter ();
  2073. xslt.Transform (new XmlTextReader (new StringReader (@"
  2074. <root>
  2075. <l0>
  2076. <p>
  2077. <span>1</span>
  2078. <span> </span>
  2079. </p>
  2080. </l0>
  2081. </root>")), null, sw);
  2082. // Assert.AreEqual (@"<y><t yes-one-node="""">1</t><t not-node=""""></t></y>", sw.ToString ());
  2083. 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 ());
  2084. }
  2085. [Test]
  2086. public void CompiledTransform_Fragment () // bug #391424
  2087. {
  2088. XslCompiledTransform xslTransform = new XslCompiledTransform ();
  2089. XsltSettings settings = new XsltSettings ();
  2090. settings.EnableDocumentFunction = true;
  2091. xslTransform.Load (TestResourceHelper.GetFullPathOfResource ("Test/XmlFiles/xsl/391424.xsl"), settings, new XmlUrlResolver ());
  2092. StringWriter sw = new StringWriter ();
  2093. xslTransform.Transform (new XPathDocument (TestResourceHelper.GetFullPathOfResource ("Test/XmlFiles/xsl/391424.xml"), XmlSpace.Preserve), null, sw);
  2094. Assert.AreEqual ("<?xml version=\"1.0\" encoding=\"utf-16\"?>Document found", sw.ToString ());
  2095. }
  2096. [Test]
  2097. public void XslTextElement_PreservesWhitespace () // bug 450797
  2098. {
  2099. XslCompiledTransform xslt = new XslCompiledTransform ();
  2100. xslt.Load (new XmlTextReader (new StringReader (@"
  2101. <xsl:stylesheet
  2102. xmlns:xsl=""http://www.w3.org/1999/XSL/Transform""
  2103. version=""1.0"">
  2104. <xsl:output method='text' omit-xml-declaration='yes'/>
  2105. <xsl:template match='foo'>
  2106. <xsl:text> </xsl:text>
  2107. </xsl:template>
  2108. </xsl:stylesheet>")));
  2109. StringWriter sw = new StringWriter ();
  2110. xslt.Transform (new XmlTextReader (new StringReader (@"<foo>bar</foo>")), null, sw);
  2111. Assert.AreEqual (" ", sw.ToString ());
  2112. }
  2113. [Test]
  2114. [Category ("MobileNotWorking")]
  2115. public void Bug487065 ()
  2116. {
  2117. using (XmlReader input = GetInput ()) {
  2118. using (XmlWriter output = XmlWriter.Create (Path.Combine(Path.GetTempPath(), "out.xml"))) {
  2119. PreProcess (input, output);
  2120. Assert.IsTrue (valueHasBeenSet, "#1");
  2121. }
  2122. }
  2123. }
  2124. private static XmlReader GetInput ()
  2125. {
  2126. return XmlReader.Create (new StringReader ("<cb:config-template xmlns:cb=\"urn:ccnet.config.builder\"><cb:define name=\"var1\">value1</cb:define></cb:config-template>"));
  2127. }
  2128. private void PreProcess (XmlReader input, XmlWriter output)
  2129. {
  2130. var xsltsettings = new XsltSettings (true, true);
  2131. var xsltpreprocess = new XslCompiledTransform (true);
  2132. var stream =
  2133. new StringReader (@"
  2134. <xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'
  2135. xmlns:msxsl='urn:schemas-microsoft-com:xslt'
  2136. xmlns:cb='urn:ccnet.config.builder'
  2137. xmlns:env='environment'
  2138. xmlns:exsl='http://exslt.org/common'
  2139. exclude-result-prefixes='msxsl cb env exsl'>
  2140. <xsl:template match='cb:define[not(*) and @name]'>
  2141. <xsl:for-each select='env:define_text_constant(@name,.)'/>
  2142. </xsl:template>
  2143. </xsl:stylesheet>");
  2144. using (XmlReader xsltreader = XmlReader.Create (stream))
  2145. xsltpreprocess.Load (xsltreader, xsltsettings, new XmlUrlResolver());
  2146. var xsltargs = new XsltArgumentList ();
  2147. // The XSLT calls extension functions in _current_env.
  2148. xsltargs.AddExtensionObject ("environment", this);
  2149. xsltpreprocess.Transform (input, xsltargs, output, null);
  2150. }
  2151. public void define_text_constant (string name, string value)
  2152. {
  2153. Assert.AreEqual("var1", name, "#a1");
  2154. Assert.AreEqual("value1", value, "#a2");
  2155. valueHasBeenSet = true;
  2156. }
  2157. private bool valueHasBeenSet;
  2158. [Test] // bug #4434
  2159. public void IncludeProcessStylesheet ()
  2160. {
  2161. string includedXsl = @"<?xml version='1.0' ?>
  2162. <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'>
  2163. <doc:template name='foo' />
  2164. <xsl:template name='foo'>
  2165. <foo />
  2166. </xsl:template>
  2167. </xsl:stylesheet>";
  2168. string file = Path.Combine (Path.GetTempPath (), "include.xsl");
  2169. StreamWriter includedWriter = new StreamWriter (file);
  2170. includedWriter.WriteLine (includedXsl);
  2171. includedWriter.Close ();
  2172. XslCompiledTransform transform = new XslCompiledTransform ();
  2173. string xsl = @"<?xml version='1.0' ?>
  2174. <xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'>
  2175. <xsl:include href='include.xsl' />
  2176. <xsl:template match='/'>
  2177. <xsl:call-template name='foo' />
  2178. </xsl:template>
  2179. </xsl:stylesheet>".Replace ("include.xsl", file);
  2180. XmlReader xslReader = XmlReader.Create (new StringReader (xsl));
  2181. transform.Load (xslReader);
  2182. XmlReader inputReader = XmlReader.Create (new StringReader ("<bar />"));
  2183. var sw = new StringWriter ();
  2184. XmlWriter outputWriter = XmlWriter.Create (sw);
  2185. transform.Transform (inputReader, outputWriter);
  2186. outputWriter.Close ();
  2187. Assert.AreEqual ("<?xml version=\"1.0\" encoding=\"utf-16\"?><foo />", sw.ToString (), "#1");
  2188. }
  2189. }
  2190. }