Xslt преобразовать в .net без экранирования < - PullRequest
0 голосов
/ 27 января 2011

Вот мой код:

XElement transformed = new XElement("stuff");
using (XmlWriter writer = transformed.CreateWriter())
{
  _xslt.Transform(section.CreateReader(), writer);
}

, где _xslt - это XslCompiledTransform, а section - это XElement.После преобразования у писателя есть содержимое, где <было изменено на <code>&lt;.Это не проблема с xsl, потому что если я использую XmlWriter, который сохраняет в файл, я НЕ вижу этого экранирования.В xsl есть несколько <xsl:value-of ... disable-output-escaping="yes"> преобразований, и именно они вызывают проблему.Опять же, если я запишу преобразование в файл, это не проблема.Я подумал, что мне может понадобиться изменить некоторые настройки для писателя, но XElement.CreateWriter не имеет конструктора, который принимает XmlWriterSettings.

Есть ли способ сделать это без преобразования в строку или построитель строки затем повторная обработка обратно в XElement?

Новая информация

Вместо XmlWriter я изменил свой код на:

using (StreamWriter writer = new StreamWriter())
{
  _xslt.Transform(section.CreateReader(), null, writer);
}

StreamWriter имеетне экранированные символы, как я хочу, теперь, как мне загрузить это обратно в мой XElement?

Запрос дополнительной информации

Вот xsl, который отлично работает сStreamWriter, но не с XmlWriter:

<xsl:template match="processing-instruction(mark_start')">
    <xsl:text disable-output-escaping="yes">&lt;addtext></xsl:text>
</xsl:template>

<xsl:template match="processing-instruction('mark_end')">
    <xsl:text disable-output-escaping="yes">&lt;/addtext></xsl:text>
</xsl:template>

И нет, у меня нет контроля над xml, поэтому я застрял с инструкциями по обработке, как указано.Таким образом, DOE работает с StreamWriter, но не с XmlWriter.

Запрос образца XML

Вот как выглядит xml, который я обрабатываю:

<text>
    this is some text
    <?mark_start>
    and some new text
    <?mark_end>
    and the rest of the text
</text>

Ответы [ 3 ]

1 голос
/ 27 января 2011

Ну, ваша основная проблема в том, что вы злоупотребляете языком XSLT, пытаясь писать теги, а не писать узлы.Вывод начального тега из одного шаблона и соответствующего конечного тега из другого - это не способ использования XSLT.Похоже, что вы обрабатываете какую-то «разметку перекрытия» в исходном документе;делать это правильно - сложный предмет с обширной литературой.Прибегать к написанию тегов, используя отключение-выход-экранирование, заманчиво, но вы должны понимать (как показывают ваши эксперименты), что это будет работать только тогда, когда процессор XSLT записывает сериализованный лексический XML в качестве своего вывода, а затем вам потребуется повторнопроанализируйте этот XML, чтобы сделать его доступным для следующего этапа обработки.

0 голосов
/ 28 января 2011

Эта таблица стилей:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()[1]|@*"/>
        </xsl:copy>
        <xsl:apply-templates select="following-sibling::node()[1]"/>
    </xsl:template>
    <xsl:template match="processing-instruction('mark_start')">
        <addtext>
            <xsl:apply-templates select="following-sibling::node()[1]"/>
        </addtext>
        <xsl:apply-templates
             select="following-sibling::processing-instruction('mark_end')
                        /following-sibling::node()[1]"/>
    </xsl:template>
    <xsl:template match="processing-instruction('mark_end')"/>
</xsl:stylesheet>

Выход:

<text>
    this is some text
    <addtext>
    and some new text
    </addtext>
    and the rest of the text
</text>

Примечание : Мелкозернистый обход.

0 голосов
/ 27 января 2011

Пока кто-то не покажет мне что-нибудь получше:

using (MemoryStream stream = new MemoryStream())
{
    using (StreamWriter writer = new StreamWriter(stream))
    {
        _xslt.Transform(section.CreateReader(), null, writer);
        stream.Seek(0, SeekOrigin.Begin);
        transformed = XElement.Load(stream);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...