Я использую Saxon HE 9.5.1.8 для преобразования XML в другой файл XML.
Моя проблема в том, что XML-контент, написанный классом Serializer () Saxon, распечатывает несколько дополнительных отступов, которые мне не нужны. Я предполагаю, что это «неправильно», потому что я получил ожидаемый результат при использовании класса DomDestination () (но тогда информация внешнего XML-документа отсутствует) или других преобразователей XSL, таких как тот, который поставляется с Visual Studio / .NET. Рамки.
Это входной XML:
<?xml version="1.0"?>
<catalog>
<book id="bk101">
<author>Gambardella, Matthew</author>
<title>XML Developer's Guide</title>
<genre>Computer</genre>
<price>$44.95</price>
<publish_date>2000-10-01</publish_date>
</book>
<book id="bk102">
<author>Ralls, Kim</author>
<title>Midnight Rain</title>
<genre>Fantasy</genre>
<price>$5.95</price>
<publish_date>2000-12-16</publish_date>
</book>
Это файл XSLT:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
<xsl:output method="xml" indent="yes"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="book">
<book>
<xsl:copy-of select="@*|book/@*" />
<xsl:for-each select="*">
<xsl:attribute name="{name()}">
<xsl:value-of select="text()"/>
</xsl:attribute>
</xsl:for-each>
</book>
</xsl:template>
</xsl:stylesheet>
Это ожидаемый результат:
<?xml version="1.0" encoding="utf-8"?>
<catalog>
<book id="bk101" author="Gambardella, Matthew" title="XML Developer's Guide" genre="Computer" price="$44.95" publish_date="2000-10-01" />
<book id="bk102" author="Ralls, Kim" title="Midnight Rain" genre="Fantasy" price="$5.95" publish_date="2000-12-16" />
</catalog>
И это результат при использовании Saxon:
<?xml version="1.0" encoding="UTF-8"?>
<catalog>
<book id="bk101"
author="Gambardella, Matthew"
title="XML Developer's Guide"
genre="Computer"
price="$44.95"
publish_date="2000-10-01"/>
<book id="bk102"
author="Ralls, Kim"
title="Midnight Rain"
genre="Fantasy"
price="$5.95"
publish_date="2000-12-16"/>
</catalog>
Кто-нибудь знает, как подавить или изменить такое поведение Saxon? Это код C #, который используется для вызова Saxon API:
public Stream Transform(string xmlFilePath, string xsltFilePath)
{
var result = new MemoryStream();
var xslt = new FileInfo(xsltFilePath);
var input = new FileInfo(xmlFilePath);
var processor = new Processor();
var compiler = processor.NewXsltCompiler();
var executable = compiler.Compile(new Uri(xslt.FullName));
var destination = new Serializer();
destination.SetOutputStream(result);
using(var inputStream = input.OpenRead())
{
var transformer = executable.Load();
transformer.SetInputStream(inputStream, new Uri(input.DirectoryName));
transformer.Run(destination);
}
result.Position = 0;
return result;
}
2 ответа
Ваша цель, чтобы несколько процессоров производили вывод в одном и том же формате, безнадежно ошибочна. Это особенно верно, если вы выберете вывод с отступом: спецификация полностью оставляет его на усмотрение реализации того, как делать отступы, говоря только, что цель состоит в том, чтобы сделать его удобочитаемым. (И установление ограничений на то, где можно вставить лишние пробелы.)
Мне жаль, что вам не нравится способ Saxon обертывать длинные списки атрибутов, но он полностью соответствует букве и духу спецификации. Без него, если у вас есть элемент с восемью объявлениями пространств имен, вы можете легко получить строку длиной 400 символов, которую я, конечно, не считаю удобочитаемой для человека.
Есть много причин, по которым лексическое сравнение двух XML-документов никогда не сработает. Например, атрибуты могут быть в другом порядке. Есть два способа сравнения XML: преобразовать документы в каноническую форму с помощью процессора «Canonical XML» или сравнить их на уровне дерева, например, с помощью функции XPath 2.0 deep-equal (). В идеале (особенно если вы хотите знать, в чем заключаются различия, а не просто существуют ли различия), используйте специальный инструмент сравнения XML, такой как DeltaXML.
Как бы то ни было, когда мы проводим модульное тестирование, мы сначала пытаемся лексически сравнить результаты. Если это не удается, мы анализируем оба документа и сравниваем их с помощью saxon: deep-equal (), который является модифицированной формой функции deep-equal (), которая дает точный контроль над правилами сравнения, например обработка пробелов и обработка пространств имен.
Попробуйте установить http://saxonica.com/documentation9.5/extensions /output-extras/line-length.html на очень большое значение, чтобы атрибуты не помещались в новую строку: <xsl:output xmlns:saxon="http://saxon.sf.net/" saxon:line-length="1000"/>
.
Похожие вопросы
Новые вопросы
c#
C# (произносится как «see Sharp») — это высокоуровневый мультипарадигменный язык программирования со статической типизацией, разработанный Microsoft. Код C# обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, которое включает в себя .NET, .NET Framework, .NET MAUI и Xamarin среди прочих. Используйте этот тег для ответов на вопросы о коде, написанном на C#, или о формальной спецификации C#.