множественная сортировка в xml с использованием xslt

Я пытаюсь отсортировать два XML-файла, чтобы сравнить их с winmerge, но у меня возникает проблема, когда мне удается отсортировать узел, но мне также нужно отсортировать несколько атрибутов с одинаковыми именами.

Вот мой XML:

<node>
<location>A</location>
<title>folder in A</title>
<acl group="group_4" permissions="111111111"/>
<acl group="group_2" permissions="110000000"/>
<acl group="group_3" permissions="110000000"/>
<acl group="group_1" permissions="110000000"/>
</node>
<node>
<location>A</location>
<title>Another folder in A</title>
<acl group="group_1" permissions="110000000"/>
<acl group="group_3" permissions="111111111"/>
<acl group="group_2" permissions="110000000"/>
</node>

мой xsl выглядит так:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" encoding="UTF-8" />
<xsl:template match="/">
<xsl:for-each select="import/node">
<xsl:sort select="location" data-type="text" order="ascending"/>
<xsl:sort select="title[not(@clear)]" data-type="text" order="ascending"/>
<xsl:sort select="@group" data-type="text" order="ascending"/>
<node>
<xsl:copy-of select="location"/>
<xsl:copy-of select="title[not(@clear)]"/>
<xsl:copy-of select="acl[not(@basegroup) and not(@baseowner) and not(@standard)]"/>
</node>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

и у меня есть этот результат:

<node>
<location>A</location>
<title>Another folder in A</title>
<acl group="group_1" permissions="110000000"/>
<acl group="group_3" permissions="111111111"/>
<acl group="group_2" permissions="110000000"/>
</node>
<node>
<location>A</location>
<title>folder in A</title>
<acl group="group_4" permissions="111111111"/>
<acl group="group_2" permissions="110000000"/>
<acl group="group_3" permissions="110000000"/>
<acl group="group_1" permissions="110000000"/>
</node>

вместо этого:

<node>
<location>A</location>
<title>Another folder in A</title>
<acl group="group_1" permissions="110000000"/>
<acl group="group_2" permissions="110000000"/>
<acl group="group_3" permissions="111111111"/>
</node>
<node>
<location>A</location>
<title>folder in A</title>
<acl group="group_1" permissions="110000000"/>
<acl group="group_2" permissions="110000000"/>
<acl group="group_3" permissions="110000000"/>
<acl group="group_4" permissions="111111111"/>
</node>

Я уже зарегистрировался в подобном посте, но ничего не работает. Заранее спасибо. С наилучшими пожеланиями.

0

Решение

Вам нужно отсортировать acl элементы отдельно, в пределах xsl:for-each (или же xsl:apply-templates) инструкция своими силами — что-то вроде:

XSLT 1.0

<xsl:stylesheet version="1.0"xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" encoding="UTF-8" />

<xsl:template match="/import">
<xsl:for-each select="node">
<xsl:sort select="location" data-type="text" order="ascending"/>
<xsl:sort select="title" data-type="text" order="ascending"/>
<node>
<xsl:copy-of select="location | title"/>
<xsl:for-each select="acl">
<xsl:sort select="@group" data-type="text" order="ascending"/>
<xsl:copy-of select="."/>
</xsl:for-each>
</node>
</xsl:for-each>
</xsl:template>

</xsl:stylesheet>
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]