Сохранение пробелов в элементах XML между атрибутами при использовании XslCompiledTransform

Я применяю файл XSL-T xsltUri в файл XML TargetXmlFile с использованием XslCompiledTransform учебный класс:

XslCompiledTransform xslTransform = new XslCompiledTransform(false);
xslTransform.Load(xsltUri);

using (var outStream = new MemoryStream())
{
    var writer = new StreamWriter(outStream, new UTF8Encoding());
    using (var reader = new XmlTextReader(TargetXmlFileName)
    {
        WhitespaceHandling = WhitespaceHandling.All,
        DtdProcessing = DtdProcessing.Ignore
    })
    {
        xslTransform.Transform(reader, xsltArguments, writer);
    }

    outStream.Position = 0;
    using (FileStream outFile = new FileStream(outputFileName, FileMode.Create))
    {
        outStream.CopyTo(outFile);
    }
}

Входной XML:

<?xml version="1.0" encoding="UTF-8"?>
<root>
  <element
    id="1"
    attr1="value11"
    attr2="value12"/>
  <element    id="2"    attr1="value21"    attr2="value22"/>
</root>

Вход XSL:

<?xml version="1.0" encoding="UTF-8"?>
<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()|@*"/>
        </xsl:copy>
    </xsl:template>

  <xsl:template match="//element[@id='2']/@attr1">
    <xsl:attribute name="attr1">
      <xsl:value-of select="'newvalue21'"/>
    </xsl:attribute>
  </xsl:template>
</xsl:stylesheet>

Фактический выходной XML:

<?xml version="1.0" encoding="utf-8"?><root>
  <element id="1" attr1="value11" attr2="value12" />
  <element id="2" attr1="newvalue21" attr2="value22" />
</root>

Желаемый выходной XML:

<?xml version="1.0" encoding="UTF-8"?>
<root>
  <element
    id="1"
    attr1="value11"
    attr2="value12"/>
  <element    id="2"    attr1="newvalue21"    attr2="value22"/>
</root>

Вопрос: Как я могу сохранить пробелы (в частности, разрывы строк) входного XML-файла в тегах "element" в выходном XML-файле? Я экспериментировал с разными вариантами, но в этом случае ничего не получалось.

Спасибо за любые подсказки!

2 ответа

Решение

Внутреннее форматирование тега (пробел между атрибутами) полностью эфемерно в XML.

  1. Что касается XML-документов, то их не существует.
  2. Что касается синтаксических анализаторов XML, то это игнорируется, потому что 1). Единственное исключение заключается в том, что пробелы запрещены сразу после <,
  3. Что касается XML-сериализаторов, они могут делать то, что хотят, потому что 1) и 2). Большинство (если не все) будут использовать один пробел для отделения атрибутов друг от друга.

Так...

  • Не пытайтесь создать приложение, которое зависит от структуры исходного кода XML.
  • Так как этот вид компоновки исходного кода в XML технически не имеет значения... избавьтесь от своего OCD.;)

Это не имеет ничего общего с XSLT. Пробел, на который вы ссылаетесь, не существует в модели документа XML, и его нельзя сделать значимым для совместимого процессора XML, даже если xml:space="preserve", В DOM нет места для него, и читатель пропустит его; как таковой нет никакого способа скопировать это автору. Вы должны будете излучать XML с пользовательским кодом (другими словами, не с XmlWriter).

Другие вопросы по тегам