XslCompiledTransformTests.cs 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. using NUnit.Framework;
  2. using System.IO;
  3. using System.Xml;
  4. using System.Xml.XPath;
  5. using System.Xml.Xsl;
  6. namespace MonoTests.System.Xml.Xsl
  7. {
  8. [TestFixture]
  9. public class XslCompiledTransformTests
  10. {
  11. [Test]
  12. public void GlobalVariableReferencesAnotherGlobalVariable ()
  13. {
  14. string xsl = @"<xsl:stylesheet version='1.0'
  15. xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
  16. <xsl:variable name='global2'><xsl:value-of select='root/@attr' /></xsl:variable>
  17. <xsl:variable name='global1'>
  18. <xsl:for-each select='//foo'>
  19. <xsl:if test='@attr = $global2'>
  20. <xsl:value-of select='name(.)' />: <xsl:value-of select='@attr' />
  21. </xsl:if>
  22. </xsl:for-each>
  23. </xsl:variable>
  24. <xsl:template match='/'>
  25. <root>
  26. <xsl:value-of select='$global1' />
  27. </root>
  28. </xsl:template>
  29. </xsl:stylesheet>";
  30. StringWriter sw = new StringWriter ();
  31. XslCompiledTransform t = new XslCompiledTransform ();
  32. t.Load (new XPathDocument (new StringReader (xsl)));
  33. t.Transform (new XPathDocument (new XmlTextReader (new StringReader ("<root attr='B'><foo attr='A'/><foo attr='B'/><foo attr='C'/></root>"))), null, sw);
  34. Assert.AreEqual ("<?xml version=\"1.0\" encoding=\"utf-16\"?><root>foo: B</root>", sw.ToString ());
  35. }
  36. [Test]
  37. [Category ("MobileNotWorking")]
  38. public void MSXslNodeSetAcceptsNodeSet ()
  39. {
  40. string xsl = @"<xsl:stylesheet version='1.0'
  41. xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns:msxsl='urn:schemas-microsoft-com:xslt'>
  42. <xsl:template match='/'>
  43. <root>
  44. <!-- msxsl:node-set() accepts a node set -->
  45. <xsl:for-each select='msxsl:node-set(root/foo)'>
  46. <xsl:value-of select='name(.)' />: <xsl:value-of select='@attr' />
  47. </xsl:for-each>
  48. </root>
  49. </xsl:template>
  50. </xsl:stylesheet>";
  51. StringWriter sw = new StringWriter ();
  52. XslCompiledTransform t = new XslCompiledTransform ();
  53. t.Load (new XPathDocument (new StringReader (xsl)));
  54. // should transform without an exception
  55. t.Transform (new XPathDocument (new XmlTextReader (new StringReader ("<root><foo attr='A'/><foo attr='B'/><foo attr='C'/></root>"))), null, sw);
  56. }
  57. [Test]
  58. [Category ("MobileNotWorking")]
  59. public void MSXslNodeSetAcceptsEmptyString ()
  60. {
  61. string xsl = @"<xsl:stylesheet version='1.0'
  62. xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns:msxsl='urn:schemas-microsoft-com:xslt'>
  63. <xsl:template match='/'>
  64. <root>
  65. <!-- msxsl:node-set() accepts an empty string -->
  66. <xsl:variable name='empty'></xsl:variable>
  67. <xsl:for-each select='msxsl:node-set($empty)'>
  68. <xsl:value-of select='name(.)' />: <xsl:value-of select='@attr' />
  69. </xsl:for-each>
  70. </root>
  71. </xsl:template>
  72. </xsl:stylesheet>";
  73. StringWriter sw = new StringWriter ();
  74. XslCompiledTransform t = new XslCompiledTransform ();
  75. t.Load (new XPathDocument (new StringReader (xsl)));
  76. // should transform without an exception
  77. t.Transform (new XPathDocument (new XmlTextReader (new StringReader ("<root><foo attr='A'/><foo attr='B'/><foo attr='C'/></root>"))), null, sw);
  78. }
  79. [Test]
  80. public void ValueOfElementWithInsignificantWhitespace ()
  81. {
  82. string xsl = @"<?xml version='1.0' encoding='utf-8'?>
  83. <xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
  84. <xsl:template match='/'>
  85. <root>
  86. <bar>
  87. <xsl:if test='root/@attr'>
  88. <xsl:value-of select='root/@attr'>
  89. </xsl:value-of>
  90. </xsl:if>
  91. </bar>
  92. <baz>
  93. <xsl:for-each select='root/foo'>
  94. <xsl:if test='position() != 1'>
  95. <xsl:text>,</xsl:text>
  96. </xsl:if>
  97. <xsl:value-of select='name(.)' />: <xsl:value-of select='@attr' />
  98. </xsl:for-each>
  99. </baz>
  100. </root>
  101. </xsl:template>
  102. </xsl:stylesheet>";
  103. StringWriter sw = new StringWriter ();
  104. XslCompiledTransform t = new XslCompiledTransform ();
  105. t.Load (new XmlTextReader(new StringReader(xsl)));
  106. t.Transform (new XPathDocument (new XmlTextReader (new StringReader ("<root attr='D'><foo attr='A'/><foo attr='B'/><foo attr='C'/></root>"))), null, sw);
  107. Assert.AreEqual ("<?xml version=\"1.0\" encoding=\"utf-16\"?><root><bar>D</bar><baz>foo: A,foo: B,foo: C</baz></root>", sw.ToString ());
  108. }
  109. [Test]
  110. public void ElementToAttribute ()
  111. {
  112. var xsl = @"<?xml version='1.0' encoding='utf-8'?>
  113. <xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
  114. <xsl:output method='xml'/>
  115. <xsl:template match='/'>
  116. <Node>
  117. <xsl:attribute name='name'>
  118. <xsl:call-template name='makeName'>
  119. <xsl:with-param name='Name' select='Node/Name' />
  120. </xsl:call-template>
  121. </xsl:attribute>
  122. </Node>
  123. </xsl:template>
  124. <xsl:template name='makeName'>
  125. <xsl:param name='Name' />
  126. <xsl:value-of select='$Name' />
  127. </xsl:template>
  128. </xsl:stylesheet>";
  129. var t = new XslCompiledTransform ();
  130. t.Load (new XmlTextReader (new StringReader (xsl)));
  131. var source = "<?xml version='1.0' encoding='utf-8' ?><Node><Name>123</Name></Node>";
  132. #if MOBILE
  133. var expected = "<?xml version=\"1.0\" encoding=\"utf-16\"?><Node name=\"123\"></Node>";
  134. #else
  135. var expected = "<?xml version=\"1.0\" encoding=\"utf-16\"?><Node name=\"123\" />";
  136. #endif
  137. StringWriter sw = new StringWriter ();
  138. var xp = new XPathDocument (new XmlTextReader (new StringReader (source)));
  139. t.Transform (xp, null, sw);
  140. Assert.AreEqual (expected, sw.ToString ());
  141. }
  142. [Test] // bug 2917
  143. [Category ("MobileNotWorking")]
  144. public void XslOutputSettings ()
  145. {
  146. XslCompiledTransform xslCompiledTransform = new XslCompiledTransform();
  147. string xsl =
  148. @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
  149. <xsl:stylesheet version=""1.0"" xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" xmlns:extensions=""urn:extensions"" exclude-result-prefixes=""extensions"">
  150. <xsl:output method=""xml"" indent=""yes""/>
  151. <xsl:template match="" / ""></xsl:template>
  152. </xsl:stylesheet>";
  153. var xmlReader = XmlReader.Create(new StringReader(xsl));
  154. xslCompiledTransform.Load(xmlReader);
  155. // Returns true on .NET and False on mono 2.10.2
  156. Assert.IsTrue (xslCompiledTransform.OutputSettings.Indent, "#1");
  157. }
  158. [Test] // Bug 36436
  159. public void TransformWithXmlDocument ()
  160. {
  161. XmlDocument doc = new XmlDocument ();
  162. doc.LoadXml (@"<ROOT/>");
  163. XmlDocument st = new XmlDocument ();
  164. st.LoadXml (@"<?xml version=""1.0"" encoding=""utf-8""?>
  165. <xsl:stylesheet version=""1.0"" xmlns:vy=""Vineyard.Elements""
  166. xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" xmlns:xlink=""http://www.w3.org/1999/xlink"" xmlns:user=""http://www.mydomain.com/mynamespace"">
  167. <xsl:output method=""xml""/>
  168. <xsl:param name=""os"" select=""ios""/>
  169. <xsl:template match=""/ROOT"" >
  170. <xsl:copy/>
  171. </xsl:template>
  172. </xsl:stylesheet>");
  173. XslCompiledTransform xsl = new XslCompiledTransform ();
  174. xsl.Load (st);
  175. XsltArgumentList args = new XsltArgumentList ();
  176. MemoryStream mstr = new MemoryStream ();
  177. xsl.Transform (doc, args, mstr);
  178. }
  179. }
  180. }