У меня огромный конфигурационный файл в формате XML. Система не заботится о порядке тегов, но мы люди! (Главным образом для сравнения версий.) Я уже получил XSLT ниже, который работает хорошо, но я обнаружил, что этого недостаточно.
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="*">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:apply-templates>
<xsl:sort select="(@name, name())[1]"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Я хочу рекурсивно отсортировать все теги по значению их атрибута name
(это работает!), Но поскольку атрибут присутствует не всегда, он также должен сортироваться по дополнительным атрибутам, любым из которых может присутствовать или не присутствовать в любом данном элементе.
У меня практически нет понимания XSLT, поэтому я экспериментирую. Я взломал вышеупомянутое в это, но это не работает как желаемый. Результат этого, кажется, идентичен вышеупомянутому.
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="*">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:apply-templates>
<xsl:sort select="@name"/>
<xsl:sort select="@row" data-type="number"/>
<xsl:sort select="@col" data-type="number"/>
<xsl:sort select="@sequence" data-type="number"/>
<xsl:sort select="@tabindex" data-type="number"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Мои данные выглядят примерно так, и проблема в том, что элементы cell
не сортируются вообще (в пределах их группы grid
), поскольку они не имеют атрибута name
. Вот почему я хотел бы расширить логику сортировки для использования атрибута name
, когда он присутствует, иначе сортировку следует выполнять с использованием дополнительных атрибутов, таких как tabindex
. Можно предположить, что в любой данной группе присутствуют одни и те же атрибуты.
<sections>
<section name="SomeList">
<caption>
<![CDATA[Candidates]]>
</caption>
...
<parameters>
<parameter name="pageSize">
<![CDATA[50]]>
</parameter>
</parameters>
...
<grid>
<cell row="0" col="7" tabindex="9" colspan="10">
<field name="Entered" />
</cell>
</grid>
</section>
</sections>
Обновление:
С очень хорошей помощью Винсента я создал сортировку, которая работает достаточно хорошо для наших целей. Вот оно.