XSLT: сохранение пробелов при копировании атрибутов

#xslt #vcproj

#xslt #vcproj

Вопрос:

Я пытаюсь отсортировать vcproj Microsoft Visual Studio так, чтобы diff показывал что-то значимое, например, после удаления файла из проекта. Помимо сортировки, я хочу сохранить все нетронутым, включая пробелы. Входные данные выглядят следующим образом

Космос <File

пробел RelativePath="filename"

пробел >

Приведенный ниже фрагмент xslt может добавлять пробелы вокруг элементов, но я не могу выяснить, как обращаться с ними вокруг атрибутов, поэтому мой вывод выглядит следующим образом

Космос <File RelativePath="filename">

xslt я использую для процессора msxsl 4.0:

<xsl:for-each select="File">

<xsl:sort select="@RelativePath"/>

<xsl:value-of select="preceding-sibling::text()[1]"/>

<xsl:copy>

<xsl:for-each select="text()|@*">

<xsl:copy/>

</xsl:for-each>

Ответ №1:

Эти пробелы всегда незначимы в XML, и я считаю, что нет возможности контролировать это поведение общим способом для любой библиотеки XML / XSLT.

Ответ №2:

XSLT работает с древовидным представлением входного XML-файла. Многие нерелевантные детали исходного XML были абстрагированы в этом дереве — например, порядок атрибутов, незначительные пробелы между атрибутами или различие между «и» в качестве разделителя атрибутов. Я не вижу какой-либо мыслимой причины для желания написать программу, которая рассматривает эти различия как существенные.

Комментарии:

1. Я бы сказал, что даже анализатор XML не заботится о порядке атрибутов или пробелах между ними в соответствии со спецификациями.