Pregunta

Estoy intentando utilizar un XslCompiledTransform, y utilizar la salida como XPathDocument.

¿Ideas?

¿Fue útil?

Solución

Enviar la transformación a un XmlTextWriter basado en un StringWriter. A continuación, la instancia XPathDocument por retreiving la cadena XML desde el StringWriter.

var sw = new StringWriter();
var xtw = new XmlTextWriter(sw);

myTransform.Transform(myXml, xtw);

var xpd = new XPathDocument(sw.ToString());

No es el mecanismo más eficiente de la memoria, pero será suficiente para la mayoría de las necesidades. Un enfoque similar sería utilizar un MemoryStream en lugar de un StringWriter pero es un poco desordenado en comparación.

Otros consejos

Mr. La respuesta de Jones fue muy útil para mí, pero he encontrado que la última línea no funcionó. Terminé haciendo esto:

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);

(Aquí, xPathDoc es un XPathDocument que ya ha sido inicializado a partir de un XmlReader.)

Un poco mejor forma de respuesta de David M. Anderson es el siguiente: que no sufre de posibles fugas de recursos; de lo contrario, es el mismo.

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);
        }
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top