Я пытаюсь отсортировать два 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>
Я уже зарегистрировался в подобном посте, но ничего не работает. Заранее спасибо. С наилучшими пожеланиями.
Вам нужно отсортировать 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>
Других решений пока нет …