Сохранение пробелов в элементах 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.
- Что касается XML-документов, то их не существует.
- Что касается синтаксических анализаторов XML, то это игнорируется, потому что 1). Единственное исключение заключается в том, что пробелы запрещены сразу после
<
, - Что касается XML-сериализаторов, они могут делать то, что хотят, потому что 1) и 2). Большинство (если не все) будут использовать один пробел для отделения атрибутов друг от друга.
Так...
- Не пытайтесь создать приложение, которое зависит от структуры исходного кода XML.
- Так как этот вид компоновки исходного кода в XML технически не имеет значения... избавьтесь от своего OCD.;)
Это не имеет ничего общего с XSLT. Пробел, на который вы ссылаетесь, не существует в модели документа XML, и его нельзя сделать значимым для совместимого процессора XML, даже если xml:space="preserve"
, В DOM нет места для него, и читатель пропустит его; как таковой нет никакого способа скопировать это автору. Вы должны будете излучать XML с пользовательским кодом (другими словами, не с XmlWriter
).