From 0c226d1a2c170e7f3888aae67dd3de85af9e2a79 Mon Sep 17 00:00:00 2001 From: Shannon Date: Wed, 20 Nov 2013 15:54:50 +1100 Subject: [PATCH] Fixes: U4-3581 Make sure advanced v7 prop editors can also be used from xslt --- src/Umbraco.Tests/LibraryTests.cs | 46 ++++++++++++++++++- .../umbraco.presentation/library.cs | 26 +++++++++++ 2 files changed, 71 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Tests/LibraryTests.cs b/src/Umbraco.Tests/LibraryTests.cs index fd8451443c..55cc9d2a02 100644 --- a/src/Umbraco.Tests/LibraryTests.cs +++ b/src/Umbraco.Tests/LibraryTests.cs @@ -62,7 +62,51 @@ namespace Umbraco.Tests get { return DatabaseBehavior.NoDatabasePerFixture; } } - [Test] + [Test] + public void Json_To_Xml_Object() + { + var json = "{ id: 1, name: 'hello', children: [{id: 2, name: 'child1'}, {id:3, name: 'child2'}]}"; + var result = library.JsonToXml(json); + Assert.AreEqual(@" + 1 + hello + + 2 + child1 + + + 3 + child2 + +", result.Current.OuterXml); + } + + [Test] + public void Json_To_Xml_Array() + { + var json = "[{id: 2, name: 'child1'}, {id:3, name: 'child2'}]"; + var result = library.JsonToXml(json); + Assert.AreEqual(@" + + 2 + child1 + + + 3 + child2 + +", result.Current.OuterXml); + } + + [Test] + public void Json_To_Xml_Error() + { + var json = "{ id: 1, name: 'hello', children: }"; + var result = library.JsonToXml(json); + Assert.IsTrue(result.Current.OuterXml.StartsWith("")); + } + + [Test] public void Get_Item_User_Property() { var val = library.GetItem(1173, "content"); diff --git a/src/Umbraco.Web/umbraco.presentation/library.cs b/src/Umbraco.Web/umbraco.presentation/library.cs index 629fd9eb8b..5cc94d4020 100644 --- a/src/Umbraco.Web/umbraco.presentation/library.cs +++ b/src/Umbraco.Web/umbraco.presentation/library.cs @@ -10,6 +10,7 @@ using System.Web; using System.Web.UI; using System.Xml; using System.Xml.XPath; +using Newtonsoft.Json; using Umbraco.Core; using Umbraco.Core.Cache; using Umbraco.Core.Configuration; @@ -235,6 +236,31 @@ namespace umbraco #region Xslt Helper functions + /// + /// This will convert a json structure to xml for use in xslt + /// + /// + /// + public static XPathNodeIterator JsonToXml(string json) + { + try + { + if (json.StartsWith("[")) + { + //we'll assume it's an array, in which case we need to add a root + json = "{\"arrayitem\":" + json + "}"; + } + var xml = JsonConvert.DeserializeXmlNode(json, "json", false); + return xml.CreateNavigator().Select("/"); + } + catch (Exception ex) + { + var xd = new XmlDocument(); + xd.LoadXml(string.Format("Could not convert json to xml. Error: {0}", ex)); + return xd.CreateNavigator().Select("/"); + } + } + /// /// Add a session variable to the current user ///