Как преобразовать XML в HTML с помощью XSLT в C # [дубликат]

Примечание: ответ Яшоды не сработал для меня, что верно в большинстве случаев.

Хотя я установил state_checked, это правда и дает ему яркий цвет, кажется, что элемент никогда checked.

Для большего поиска я обнаружил, что проблема произошла с пунктом меню. Я не дал проверенному элементу true в пункте меню в файле меню.

Затем мне нужно добавить к нему тег android:checkable=true.

и работает как прелесть.

20
задан Shaul Behr 22 November 2009 в 10:48
поделиться

2 ответа

Как насчет:

public static string TransformXMLToHTML(string inputXml, string xsltString)
{
    XslCompiledTransform transform = new XslCompiledTransform();
    using(XmlReader reader = XmlReader.Create(new StringReader(xsltString))) {
        transform.Load(reader);
    }
    StringWriter results = new StringWriter();
    using(XmlReader reader = XmlReader.Create(new StringReader(inputXml))) {
        transform.Transform(reader, null, results);
    }
    return results.ToString();
}

Обратите внимание, что в идеале вы должны кэшировать и повторно использовать XslCompiledTransform - или, возможно, использовать XslTransform вместо этого (он отмечен как устаревший, хотя).

37
ответ дан Marc Gravell 18 August 2018 в 17:08
поделиться
  • 1
    +1: это не получается проще. – Dathan 22 November 2009 в 11:04
  • 2
    Марк, ты принц среди мужчин. :) – Shaul Behr 22 November 2009 в 11:08
  • 3
    Очень аккуратно и просто. – Chris 28 August 2013 в 10:23
  • 4
    ну это может быть проще, чем это. Все эти читатели XML могут быть заменены фактическим расположением файлов, таких как: XslCompiledTransform transform = new XslCompiledTransform (& quot; файл: // & quot; + xsltString); Также преобразование имеет версию, в которой вы можете передать местоположение файла, используя этот файл: // & quot; + inputXml трюк;) – tecfield 21 November 2014 в 16:46

Просто для удовольствия, немного менее элегантная версия, которая реализует кеширование, предложенное Marc:

    public static string TransformXMLToHTML(string inputXml, string xsltString)
    {
        XslCompiledTransform transform = GetAndCacheTransform(xsltString);
        StringWriter results = new StringWriter();
        using (XmlReader reader = XmlReader.Create(new StringReader(inputXml)))
        {
            transform.Transform(reader, null, results);
        }
        return results.ToString();
    }

    private static Dictionary<String, XslCompiledTransform> cachedTransforms = new Dictionary<string, XslCompiledTransform>();
    private static XslCompiledTransform GetAndCacheTransform(String xslt)
    {
        XslCompiledTransform transform;
        if (!cachedTransforms.TryGetValue(xslt, out transform))
        {
            transform = new XslCompiledTransform();
            using (XmlReader reader = XmlReader.Create(new StringReader(xslt)))
            {
                transform.Load(reader);
            }
            cachedTransforms.Add(xslt, transform);
        }
        return transform;
    }
4
ответ дан Dathan 18 August 2018 в 17:08
поделиться
  • 1
    Вам нужно будет беспокоиться о безопасности потока / синхронизации вокруг словаря, но что-то в этом направлении, да. – Marc Gravell♦ 22 November 2009 в 12:04
  • 2
    И мне приходит в голову, что было бы целесообразно хэш xsltString и вместо этого использовать этот хеш. Некоторые преобразования могут стать довольно большими - никаких оснований нести дополнительное ограничение памяти, сохраняя его в скомпилированной форме в XslCompiledTransform и снова в качестве ключа. – Dathan 24 November 2009 в 03:30
Другие вопросы по тегам:

Похожие вопросы: