Шаг 1. Конвертируйте ваши данные в XML:
Итак, дан список фотографий:
var photoXml = new XElement("photos",
new XElement("album",
new XAttribute("albumId", albumId),
new XAttribute("albumName", albumName),
new XAttribute("modified", DateTime.Now.ToUniversalTime().ToString("r")),
from p in photos
select
new XElement("photo",
new XElement("id", p.PhotoID),
new XElement("caption", p.Caption),
new XElement("tags", p.StringTags),
new XElement("albumId", p.AlbumID),
new XElement("albumName", p.AlbumName)
) // Close element photo
) // Close element album
);// Close element photos
Шаг 2. Запустите XML через некоторый XSLT:
Затем, используя что-то вроде следующего, пропустите через some XSLT , где xslPath - это путь к вашему XSLT, current - это текущий HttpContext:
var xt = new XslCompiledTransform();
xt.Load(xslPath);
var ms = new MemoryStream();
if (null != current){
var xslArgs = new XsltArgumentList();
var xh = new XslHelpers(current);
xslArgs.AddExtensionObject("urn:xh", xh);
xt.Transform(photoXml.CreateNavigator(), xslArgs, ms);
} else {
xt.Transform(photoXml.CreateNavigator(), null, ms);
}
// Set the position to the beginning of the stream.
ms.Seek(0, SeekOrigin.Begin);
// Read the bytes from the stream.
var byteArray = new byte[ms.Length];
ms.Read(byteArray, 0, byteArray.Length);
// Decode the byte array into a char array
var uniEncoding = new UTF8Encoding();
var charArray = new char[uniEncoding.GetCharCount(
byteArray, 0, byteArray.Length)];
uniEncoding.GetDecoder().GetChars(
byteArray, 0, byteArray.Length, charArray, 0);
var sb = new StringBuilder();
sb.Append(charArray);
// Returns the XML as a string
return sb.ToString();
У меня есть эти два бита кода в одном методе "BuildPhotoStream".
Класс "XslHelpers" содержит следующее:
public class XslHelpers{
private readonly HttpContext current;
public XslHelpers(HttpContext currentContext){
current = currentContext;
}
public String ConvertDateTo822(string dateTime){
DateTime original = DateTime.Parse(dateTime);
return original.ToUniversalTime()
.ToString("ddd, dd MMM yyyy HH:mm:ss G\"M\"T");
}
public String ServerName(){
return current.Request.ServerVariables["Server_Name"];
}
}
Это в основном дает мне хорошее форматирование дат, которое XSLT не дает мне.
Шаг 3. Отобразить полученный XML-код обратно клиентскому приложению:
"BuildPhotoStream" вызывается "RenderHelpers.Photos" и "RenderHelpers.LatestPhotos", которые отвечают за получение деталей фотографии из объектов Linq2Sql, и они вызываются с пустой страницы aspx (теперь я знаю, что это должно действительно быть обработчиком ASHX, я просто не удосужился его исправить):
protected void Page_Load(object sender, EventArgs e)
{
Response.ContentType = "application/rss+xml";
ResponseEncoding = "UTF-8";
if (!string.IsNullOrEmpty(Request.QueryString["AlbumID"]))
{
Controls.Add(new LiteralControl(RenderHelpers
.Photos(Server.MapPath("/xsl/rssPhotos.xslt"), Context)));
}
else
{
Controls.Add(new LiteralControl(RenderHelpers
.LatestPhotos(Server.MapPath("/xsl/rssLatestPhotos.xslt"), Context)));
}
}
В конце всего этого я получаю следующее:
http://www.doodle.co.uk/Albums/Rss.aspx?AlbumID=61
, который работал в Cooliris / PicLens, когда я его настраивал, однако теперь кажется, что он рендерит изображения в плоскости отражения, и когда вы щелкаете по ним, но не в виде стены: (
Если вы пропустили это выше, XSLT можно найти здесь:
http://www.doodle.co.uk/xsl/rssPhotos.xslt
Вам, очевидно, нужно будет отредактировать его в соответствии с вашими потребностями (и открыть его в чем-то вроде Visual Studio - FF скрывает большинство таблиц стилей def, включая xmlns: atom = "http://www.w3.org/2005/Atom" xmlns: media =" http://search.yahoo.com/mrss").