Я пытаюсь «красиво» XML-файл. Как было отмечено в некоторых других SO вопросов, я использую следующую таблицу стилей для преобразования:XSLT indent не работает с MSXML
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes" method="xml" encoding="UTF-16" />
<xsl:strip-space elements="*"/>
<xsl:template match="node() | @*">
<xsl:copy>
<xsl:apply-templates select="node() | @*" />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Однако это не производит желаемых результатов. Для входного файла:
<A><B><C /></B></A>
сгенерированного выходе:
<?xml version="1.0" encoding="UTF-16"?>
<A>
<B>
<C>
</C>
</B>
</A>
Но выход я ожидаю это (строка заголовка не имеет значения):
<A>
<B>
<C />
</B>
</A>
Так являются две проблемы:
- Нет отступов в o utput
- Тег
<C />
был «распакован», что я не хочу.
Я попытался с MSXSL.exe, и с помощью (с помощью C++) IXMLDOMDocument2::transformNode вывода на BSTR
, оба метода дают идентичный выход.
Что здесь не так?
Утилита MSXSL.exe составляет 11 лет. 'IXMLDOMDocument2' также чрезвычайно стар. Я бы предложил создать вашу собственную простую утилиту, используя ['XmlCompiledTransform'] (https://msdn.microsoft.com/en-us/library/system.xml.xsl.xslcompiledtransform (v = vs.110) .aspx). Это рекомендуемый .NET API для выполнения XSLT и, безусловно, будет обрабатывать отступы правильно. Вы также можете использовать что-то вроде Saxon, но текущую версию для XSLT 2.0, и вы можете столкнуться с некоторыми проблемами совместимости, если вы пишете XSLT 1.0. – JLRishe
@JLRishe Моя цель - сделать это программно с C++ (не .NET), есть ли версия COM этого (или иначе)? MSXSL - это всего лишь 25 КБ, поэтому предположительно это просто выгрузка на другой объект Windows, который должен быть обновлен. –
Да, MSXSL.exe - это всего лишь оболочка для нескольких различных COM-интерфейсов для XSLT (вы можете получить исходный код утилиты из указанной вами ссылки и посмотреть файл msxmlinf.cxx), который, скорее всего, не был обновлен в 11 года. Боюсь, я не знаю лучшего варианта для COM. Обычно я не работаю с COM или собственным кодом. – JLRishe