Question

Je suis en train d'utiliser un XslCompiledTransform et utiliser la sortie comme XPathDocument.

Des idées?

Était-ce utile?

La solution

Envoyez le fichier de transformation à un XmlTextWriter basé sur un StringWriter. Ensuite, par exemple la XPathDocument par retreiving 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());

Son pas le plus mécanisme efficace de la mémoire, mais sera suffisant pour la plupart des besoins. Une approche similaire serait d'utiliser un MemoryStream au lieu d'un StringWriter mais son un peu désordonné par comparaison.

Autres conseils

Monsieur. La réponse de Jones a été très utile pour moi, mais je l'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 souffre pas de fuites de ressources potentielles; sinon il est le même.

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);
        }
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top