Pergunta

Estou tentando usar um XSLCompiledTransform e usar a saída como um XPathDocument.

Alguma ideia?

Foi útil?

Solução

Envie a transformação para um XmlTextWriter com base em a StringWriter. Então instância XPathDocument Rodundendo a sequência XML da StringWriter.

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

myTransform.Transform(myXml, xtw);

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

Não é o mecanismo mais eficiente da memória, mas será adequado para a maioria das necessidades. Uma abordagem semelhante seria usar um MemoryStream em vez de um StringWriter Mas é um pouco confuso em comparação.

Outras dicas

A resposta do Sr. Jones foi muito útil para mim, mas descobri que a última linha não funcionava. Acabei fazendo isso:

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

(Aqui, o XPathdoc é um XPathDocument que já foi inicializado a partir de um XMLReader.)

Uma forma um pouco melhor da resposta de David M. Anderson está abaixo: ela não sofre de possíveis vazamentos de recursos; Caso contrário, é o mesmo.

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top