Преобразование XML-документа на месте с помощью XSL

#c# #xml #xslt

#c# #xml #xslt

Вопрос:

Извините, если это очевидный вопрос, но я немного расстраиваюсь, пытаясь найти ответ.

Могу ли я выполнить преобразование XSL для загруженного XML-документа на месте? То есть без необходимости создавать средство записи в документ?

Я спрашиваю, потому что у меня есть привязка XmlDocument внутри приложения WPF, которое я хочу отсортировать. Сортировка может немного усложниться, поэтому XSL показался подходящим. Вот код, на котором я застрял:

 XmlDataProvider xmlDP = (XmlDataProvider)this.Resources["ItemDB"];
string xsltPath = System.Configuration.ConfigurationManager.AppSettings["XSLDirextory"];
string path = xsltPath   "SortItemName.xslt";
if (System.IO.File.Exists(path))
{
    XslCompiledTransform compTrans = new XslCompiledTransform();
    compTrans.Load(path);
    //compTrans.Transform(xmlDP.Document, new XsltArgumentList(), xmlDP.Document.XmlResolver);
}
  

После загрузки преобразования я хотел бы просто иметь возможность compTrans(xmlDP.Document); или что-то, что имеет тот же эффект. (для ясности, xmlDP.Document является XmlDocument ), так что XmlDocument имеет результат преобразования.

Каков наилучший способ добиться этого?

Комментарии:

1. Почему вы не хотите создавать запись в документ? На самом деле, почему бы не преобразовать документ из документа в другой документ, а затем связать новый документ?

2. Я не хотел записывать обратно в документ, потому что в копии в памяти могут быть некоторые различия. Если пользователь закрывает приложение, я не хочу, чтобы эти изменения отражались обратно в фактический документ, если пользователь явно не сохранил его. Что касается создания нового документа, я думаю, я мог бы, но, похоже, должен быть лучший способ сделать это.

Ответ №1:

Самое близкое, что вы можете сделать, это создать новый XmlDocument с помощью, например

 XmlDocument result = new XmlDocument();
using (XmlWriter xw = result.CreateNavigator().AppendChild())
{
  compTrans.Transform(xmlDP.Document, null, xw);
  xw.Close();
}
  

а затем назначьте это своему свойству:

 xmlDP.Document = result;
  

Конечно, для этого требуется, чтобы можно было установить xmlDP.Document.

Ответ №2:

XSLT всегда создает новый документ для хранения результата преобразования, он никогда не изменяет входной документ.