سؤال

أحاول استخدام 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 عبارة عن حجة Xpathdocence التي تم تهيئتها بالفعل من XmlReader.)

يوجد أدناه شكل أفضل قليلاً من إجابة David M. Anderson: لا يعاني من تسرب الموارد المحتملة ؛ وإلا هو نفسه.

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);
        }
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top