Я пытаюсь канонизировать представление некоторых данных XML, сортируя атрибуты каждого элемента по имени (не по значению). Идея состоит в том, чтобы минимизировать текстовые различия при добавлении или удалении атрибутов и не допускать, чтобы разные редакторы вводили эквивалентные варианты. Эти XML-файлы находятся под контролем исходного кода, и разработчики хотят анализировать изменения, не прибегая к специализированным инструментам XML.
Я был удивлен, чтобы не нашел пример XSL, как это сделать. В основном я хочу просто преобразование идентичности с отсортированными атрибутами. Я пришел к следующему с, кажется, работает во всех моих тестовых случаях:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
<xsl:template match="*|/|text()|comment()|processing-instruction()">
<xsl:copy>
<xsl:for-each select="@*">
<xsl:sort select="name(.)"/>
<xsl:copy/>
</xsl:for-each>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
В целом XSL n00b я буду признателен за любые комментарии по стилю или эффективности. Я подумал, что было бы полезно опубликовать это здесь, так как это, по крайней мере, не обычный пример.