J'essaie d'utiliser un XslCompiledTransform et d'utiliser la sortie en tant que XPathDocument.Sortie XslCompiledTransform en tant que XPathDocument
Des idées?
J'essaie d'utiliser un XslCompiledTransform et d'utiliser la sortie en tant que XPathDocument.Sortie XslCompiledTransform en tant que XPathDocument
Des idées?
Envoie la transformation à un XmlTextWriter
basé sur un StringWriter
. Ensuite, instance le XPathDocument
en récupérant la chaîne XML à partir du StringWriter
.
var sw = new StringWriter();
var xtw = new XmlTextWriter(sw);
myTransform.Transform(myXml, xtw);
var xpd = new XPathDocument(sw.ToString());
Ce n'est pas le mécanisme le plus efficace en termes de mémoire, mais il convient à la plupart des besoins. Une approche similaire serait d'utiliser un MemoryStream
au lieu d'un StringWriter
mais c'est un peu brouillon par comparaison.
La réponse de M. Jones m'a été très utile, mais j'ai trouvé que la dernière ligne ne fonctionnait pas. J'ai fini par faire ceci:
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);
(Ici, xPathDoc est un XPathDocument qui a déjà été initialisé à partir d'un XmlReader.)
Une forme légèrement meilleure de la réponse de David M. Anderson est ci-dessous: il ne souffrir de fuites de ressources potentielles; sinon c'est pareil.
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);
}
}
}