У меня проблемы с реализацией сортировки. У меня есть документ XML, который я хочу сделать копию 1 в 1, за исключением сортировки определенных элементов по порядку. Структура документа должна быть такой же после копии, чтобы проверить ее по схеме. Я не контролирую схему, поэтому не могу ее изменить. Вот упрощенная версия моих данных XML:
<ResponseDoc xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<resHead>
<id>R1983Rs</id>
</resHead>
<item>
<objRef>
<objId>100</objId>
<sysId>xyz</sysId>
</objRef>
<!-- Additional data here -->
</item>
<item>
<objRef>
<objId>140</objId>
<sysId>abc</sysId>
</objRef>
<!-- Additional data here -->
</item>
<resFoot>
<id>1234</id>
</resFoot>
</ResponseDoc>
Я хочу отсортировать элементы <item>
в определенном порядке. Полученный XML-файл должен быть:
<ResponseDoc xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<resHead>
<id>R1983Rs</id>
</resHead>
<item>
<objRef>
<objId>140</objId>
<sysId>abc</sysId>
</objRef>
<!-- Additional data here -->
</item>
<item>
<objRef>
<objId>100</objId>
<sysId>xyz</sysId>
</objRef>
<!-- Additional data here -->
</item>
<resFoot>
<id>1234</id>
</resFoot>
</ResponseDoc>
Мне удалось отсортировать следующую таблицу стилей XSL:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes" />
<xsl:template match="ResponseDoc">
<xsl:copy>
<xsl:apply-templates select="resHead" />
<xsl:apply-templates select="item">
<xsl:sort select="number(objRef/objId)" order="descending" />
</xsl:apply-templates>
<xsl:apply-templates select="resFoot" />
</xsl:copy>
</xsl:template>
<xsl:template match="node() | @*">
<xsl:copy>
<xsl:apply-templates select="node() | @*" />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Но это неудовлетворительно, так как мне нужно явно обработать <resHead>
и <resFoot>
, и если схема будет расширена, чтобы включить дополнительные братья и сестры до <item>
, мне нужно будет найти этот XSL и изменить его. Я провел много исследований, но нашел только примеры, которые либо не содержат элементов одного уровня, либо содержат «отсортированные» элементы внутри некоторого элемента «контейнера», т. Е .:
...
<items>
<item>...</item>
<item>...</item>
<item>...</item>
</items>
...
Я бы хотел найти более общий способ выполнения сортировки. Я пробовал много вариантов рабочей таблицы стилей, но я либо теряю, либо перемещаю узлы-братья, либо нарушаю сортировку. Кто-нибудь может помочь?