Skip to content

Commit

Permalink
Added support for XSL arguments in XmlTransform
Browse files Browse the repository at this point in the history
fixes #2524
  • Loading branch information
deqenq authored and augustoproiete committed Oct 10, 2021
1 parent f6b5b10 commit a307768
Show file tree
Hide file tree
Showing 5 changed files with 254 additions and 11 deletions.
39 changes: 39 additions & 0 deletions src/Cake.Common.Tests/Properties/Resources.Designer.cs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

68 changes: 68 additions & 0 deletions src/Cake.Common.Tests/Properties/Resources.resx
Original file line number Diff line number Diff line change
Expand Up @@ -1433,4 +1433,72 @@ Global
EndGlobalSection
EndGlobal</value>
</data>
<data name="XmlTransformationWithArguments_Xsl" xml:space="preserve">
<value>&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"&gt;
&lt;xsl:output method="html" encoding="utf-8"/&gt;
&lt;xsl:param name="BackgroundColor"&gt;&lt;/xsl:param&gt;
&lt;xsl:param name="Color"&gt;&lt;/xsl:param&gt;

&lt;xsl:template match="/"&gt;
&lt;html&gt;
&lt;body style="font-family:Arial;font-size:12pt;background-color:#EEEEEE"&gt;
&lt;xsl:for-each select="breakfast_menu/food"&gt;
&lt;div style="background-color:{$BackgroundColor};color:{$Color};padding:4px"&gt;
&lt;span style="font-weight:bold"&gt;
&lt;xsl:value-of select="name" /&gt;
-
&lt;/span&gt;
&lt;xsl:value-of select="price" /&gt;
&lt;/div&gt;
&lt;div style="margin-left:20px;margin-bottom:1em;font-size:10pt"&gt;
&lt;p&gt;
&lt;xsl:value-of select="description" /&gt;
&lt;span style="font-style:italic"&gt;
(
&lt;xsl:value-of select="calories" /&gt;
calories per serving)
&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;/xsl:for-each&gt;
&lt;/body&gt;
&lt;/html&gt;
&lt;/xsl:template&gt;
&lt;/xsl:stylesheet&gt;</value>
</data>
<data name="XmlTransformationWithArgumentsAndNamespace_Xsl" xml:space="preserve">
<value>&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:input="http://example.com" exclude-result-prefixes="input" version="1.0"&gt;
&lt;xsl:output method="html" encoding="utf-8"/&gt;
&lt;xsl:param name="input:BackgroundColor"&gt;&lt;/xsl:param&gt;
&lt;xsl:param name="input:Color"&gt;&lt;/xsl:param&gt;

&lt;xsl:template match="/"&gt;
&lt;html&gt;
&lt;body style="font-family:Arial;font-size:12pt;background-color:#EEEEEE"&gt;
&lt;xsl:for-each select="breakfast_menu/food"&gt;
&lt;div style="background-color:{$input:BackgroundColor};color:{$input:Color};padding:4px"&gt;
&lt;span style="font-weight:bold"&gt;
&lt;xsl:value-of select="name" /&gt;
-
&lt;/span&gt;
&lt;xsl:value-of select="price" /&gt;
&lt;/div&gt;
&lt;div style="margin-left:20px;margin-bottom:1em;font-size:10pt"&gt;
&lt;p&gt;
&lt;xsl:value-of select="description" /&gt;
&lt;span style="font-style:italic"&gt;
(
&lt;xsl:value-of select="calories" /&gt;
calories per serving)
&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;/xsl:for-each&gt;
&lt;/body&gt;
&lt;/html&gt;
&lt;/xsl:template&gt;
&lt;/xsl:stylesheet&gt;</value>
</data>
</root>
51 changes: 51 additions & 0 deletions src/Cake.Common.Tests/Unit/XML/XmlTransformationTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
using System.IO;
using System.Linq;
using System.Text;
using System.Xml.Xsl;
using Cake.Common.Tests.Fixtures;
using Cake.Common.Tests.Properties;
using Cake.Common.Xml;
Expand Down Expand Up @@ -240,6 +241,56 @@ public void Should_Throw_If_String_Settings_Was_Null()
// Then
AssertEx.IsArgumentNullException(result, "settings");
}

[Fact]
public void Should_Throw_If_XslArguments_Was_Null()
{
// Given
var xml = Resources.XmlTransformation_Xml;
var xsl = Resources.XmlTransformation_Xsl;

// When
var result = Record.Exception(() => XmlTransformation.Transform(xsl, null, xml));

// Then
AssertEx.IsArgumentNullException(result, "arguments");
}

[Fact]
public void Should_Transform_Xml_String_And_Xsl_String_WithArguments_To_Result_String()
{
// Given
var xml = Resources.XmlTransformation_Xml;
var xsl = Resources.XmlTransformationWithArguments_Xsl;
var htm = Resources.XmlTransformation_Htm_NoXmlDeclaration;
var arguments = new XsltArgumentList();
arguments.AddParam("BackgroundColor", string.Empty, "teal");
arguments.AddParam("Color", string.Empty, "white");

// When
var result = XmlTransformation.Transform(xsl, arguments, xml);

// Then
Assert.Equal(htm, result, ignoreLineEndingDifferences: true);
}

[Fact]
public void Should_Transform_Xml_String_And_Xsl_String_WithArgumentsAndNamespace_To_Result_String()
{
// Given
var xml = Resources.XmlTransformation_Xml;
var xsl = Resources.XmlTransformationWithArgumentsAndNamespace_Xsl;
var htm = Resources.XmlTransformation_Htm_NoXmlDeclaration;
var arguments = new XsltArgumentList();
arguments.AddParam("BackgroundColor", "http://example.com", "teal");
arguments.AddParam("Color", "http://example.com", "white");

// When
var result = XmlTransformation.Transform(xsl, arguments, xml);

// Then
Assert.Equal(htm, result, ignoreLineEndingDifferences: true);
}
}
}
}
4 changes: 2 additions & 2 deletions src/Cake.Common/Polyfill/XmlTransformationHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,11 @@ namespace Cake.Common.Polyfill
{
internal static class XmlTransformationHelper
{
public static void Transform(XmlReader xsl, XmlReader xml, XmlWriter result)
public static void Transform(XmlReader xsl, XsltArgumentList arguments, XmlReader xml, XmlWriter result)
{
var xslTransform = new XslCompiledTransform();
xslTransform.Load(xsl);
xslTransform.Transform(xml, result);
xslTransform.Transform(xml, arguments, result);
}
}
}
Loading

0 comments on commit a307768

Please sign in to comment.