Какой способ преобразования с помощью XSL без HTML-кодировки мой окончательный вывод? - PullRequest
4 голосов
/ 09 февраля 2009

Итак, я работаю с .NET. У меня есть XSL-файл, объект XslTransform в C #, который читает в XSL-файл и преобразует часть данных XML (изготовленных собственными силами) в HTML.

Я заметил, что мой окончательный вывод имеет <</strong> и > , автоматически закодированные в & lt; и & gt; . Есть ли способы, которыми я могу предотвратить это? Иногда мне нужно выделять жирным шрифтом или курсивом мой текст, но он был непреднамеренно продезинфицирован.

Ответы [ 3 ]

4 голосов
/ 09 февраля 2009

Ваш xsl-файл должен иметь:

  • вывод html
  • пропустить пространства имен для всех используемых в xslt

т.е.

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt"
    exclude-result-prefixes="xsl msxsl">

    <xsl:output method="html" indent="no" omit-xml-declaration="yes"/>

    <!-- lots -->
</xsl:stylesheet>

И в идеале вы должны использовать перегрузки, которые принимают либо TextWriter, либо Stream (не XmlWriter) - т.е. что-то вроде:

StringBuilder sb = new StringBuilder();
using (XmlReader reader = XmlReader.Create(source)
using (TextWriter writer = new StringWriter(sb))
{
    XslCompiledTransform xslt = new XslCompiledTransform();
    xslt.Load("Foo.xslt"); // in reality, you'd want to cache this
    xslt.Transform(reader, options.XsltOptions, writer);
}
string html = sb.ToString();

В xslt, если вы действительно хотите автономный < / > (т.е. вы хотите, чтобы он по какой-то причине искажался), вам нужно отключить экранирование выхода:

<xsl:text disable-output-escaping="yes">
    Your malformed text here
</xsl:text>

Однако, как правило, правильно экранировать символы.

2 голосов
/ 09 февраля 2009

В прошлом я использовал это для преобразования документов XMl в строки HTML, что вам нужно.

public static string TransformXMLDocFromFileHTMLString(string orgXML, string transformFilePath)
{
    System.Xml.XmlDocument orgDoc = new System.Xml.XmlDocument();
    orgDoc.LoadXml(orgXML);

    XmlNode transNode = orgDoc.SelectSingleNode("/");
    System.Text.StringBuilder sb = new System.Text.StringBuilder();
    XmlWriterSettings settings = new XmlWriterSettings();

    settings.ConformanceLevel = ConformanceLevel.Auto;
    XmlWriter writer = XmlWriter.Create(sb, settings);

    System.Xml.Xsl.XslCompiledTransform trans = new System.Xml.Xsl.XslCompiledTransform();
    trans.Load(transformFilePath);

    trans.Transform(transNode, writer);

    return sb.ToString();
}
0 голосов
/ 09 февраля 2009

(XslTransform устарела, согласно MSDN. Они рекомендуют переключиться на XslCompiledTransform.)

Можете ли вы опубликовать пример ввода / вывода?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...