Я пытаюсь использовать XslCompiledTransform и использовать вывод как XPathDocument.XslCompiledTransform вывод как XPathDocument
Любые идеи?
Я пытаюсь использовать XslCompiledTransform и использовать вывод как XPathDocument.XslCompiledTransform вывод как XPathDocument
Любые идеи?
Отправить преобразование в XmlTextWriter
на основе StringWriter
. Затем введите XPathDocument
, вернув строку XML из StringWriter
.
var sw = new StringWriter();
var xtw = new XmlTextWriter(sw);
myTransform.Transform(myXml, xtw);
var xpd = new XPathDocument(sw.ToString());
Его не самый эффективный механизм памяти, но он будет достаточным для большинства потребностей. Аналогичный подход будет использовать MemoryStream
вместо StringWriter
, но его немного беспорядочно по сравнению.
Ответ г-на Джонса был очень полезен для меня, но я обнаружил, что последняя строка не работает. Я в конечном итоге делает это:
XslCompiledTransform xsl = new XslCompiledTransform();
xsl.Load(filePath);
StringWriter stringWriter = new StringWriter();
XmlWriter xmlWriter = XmlTextWriter.Create(stringWriter);
xsl.Transform(xPathDoc, xmlWriter);
String newXml = stringWriter.ToString();
StringReader stringReader = new StringReader(newXml);
xPathDoc = new XPathDocument(stringReader);
(Здесь xPathDoc является XPathDocument, который уже был инициализирован от XmlReader.)
Немного лучше форма ответа Дэвида М. Андерсона ниже: это не страдают от потенциальных утечек ресурсов; в противном случае это то же самое.
private static XPathDocument TransformToXPathDocument(string styleSheetPath,
IXPathNavigable xPathDoc)
{
var xsl = new XslCompiledTransform();
xsl.Load(styleSheetPath);
using(var stringWriter = new StringWriter())
{
using(XmlWriter xmlWriter = XmlWriter.Create(stringWriter))
{
xsl.Transform(xPathDoc, xmlWriter);
}
using(var reader = new StringReader(stringWriter.ToString()))
{
return new XPathDocument(reader);
}
}
}