XSLT-将XML文档转换为元素按字母顺序排列



我正在尝试使用XSLT转换XML文档,以便使用关键字按字母顺序排列"entry"元素。

我的XML示例如下:

<Custom name="Custom Name1">
<Attributes>
<Map>
<entry key="entry4">
<value>
<Map>
<entry key="Active" value="true"/>
<entry key="Entitlements">
<value>
<List>
<String>String13</String>
</List>
</value>
</entry>
<entry key="Refresh" value="true"/>
</Map>
</value>
</entry>
<entry key="entry1">
<value>
<Map>
<entry key="Active" value="true"/>
<entry key="Entitlements">
<value>
<List>
<String>String6</String>
</List>
</value>
</entry>
<entry key="Refresh" value="true"/>
</Map>
</value>
</entry>
<entry key="entry2">
<value>
<Map>
<entry key="Active" value="true"/>
<entry key="Entitlements">
<value>
<List>
<String>String5</String>
</List>
</value>
</entry>
<entry key="Refresh" value="true"/>
</Map>
</value>
</entry>
<entry key="entry3">
<value>
<Map>
<entry key="Active" value="true"/>
<entry key="Entitlements">
<value>
<List>
<String>String2</String>
</List>
</value>
</entry>
<entry key="Refresh" value="true"/>
</Map>
</value>
</entry>
</Map>
</Attributes>
</Custom>

因此,我正在努力实现以下结果:

<Custom name="Custom Name1">
<Attributes>
<Map>
<entry key="entry1">
<value>
<Map>
<entry key="Active" value="true"/>
<entry key="Entitlements">
<value>
<List>
<String>String6</String>
</List>
</value>
</entry>
<entry key="Refresh" value="true"/>
</Map>
</value>
</entry>
<entry key="entry2">
<value>
<Map>
<entry key="Active" value="true"/>
<entry key="Entitlements">
<value>
<List>
<String>String5</String>
</List>
</value>
</entry>
<entry key="Refresh" value="true"/>
</Map>
</value>
</entry>
<entry key="entry3">
<value>
<Map>
<entry key="Active" value="true"/>
<entry key="Entitlements">
<value>
<List>
<String>String2</String>
</List>
</value>
</entry>
<entry key="Refresh" value="true"/>
</Map>
</value>
</entry>
<entry key="entry4">
<value>
<Map>
<entry key="Active" value="true"/>
<entry key="Entitlements">
<value>
<List>
<String>String13</String>
</List>
</value>
</entry>
<entry key="Refresh" value="true"/>
</Map>
</value>
</entry>
</Map>
</Attributes>
</Custom>

我尝试使用以下XSLT来转换我的XML文档:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/Custom/Attributes/Map">
<xsl:apply-templates>
<xsl:sort select="@key" data-type="text" order="ascending"/>
</xsl:apply-templates>      
</xsl:template>
</xsl:stylesheet>

它正在按照我的意愿对元素进行排序,但随后似乎删除了map元素,给了我以下内容的输出:

<Custom name="Custom Name1">
<Attributes>
<entry key="entry1">
<value>
<Map>
<entry key="Active" value="true"/>
<entry key="Entitlements">
<value>
<List>
<String>String6</String>
</List>
</value>
</entry>
<entry key="Refresh" value="true"/>
</Map>
</value>
</entry>
<entry key="entry2">
<value>
<Map>
<entry key="Active" value="true"/>
<entry key="Entitlements">
<value>
<List>
<String>String5</String>
</List>
</value>
</entry>
<entry key="Refresh" value="true"/>
</Map>
</value>
</entry>
<entry key="entry3">
<value>
<Map>
<entry key="Active" value="true"/>
<entry key="Entitlements">
<value>
<List>
<String>String2</String>
</List>
</value>
</entry>
<entry key="Refresh" value="true"/>
</Map>
</value>
</entry>
<entry key="entry4">
<value>
<Map>
<entry key="Active" value="true"/>
<entry key="Entitlements">
<value>
<List>
<String>String13</String>
</List>
</value>
</entry>
<entry key="Refresh" value="true"/>
</Map>
</value>
</entry>
</Attributes>
</Custom>

知道我在这里做错了什么吗?

非常感谢,Connor

您匹配了Map,但没有复制或创建新的映射元素。只需添加xsl:copy,就可以开始了。。。

<xsl:template match="/Custom/Attributes/Map">
<xsl:copy>
<xsl:apply-templates>
<xsl:sort select="@key" data-type="text" order="ascending"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>

Fiddle:http://xsltfiddle.liberty-development.net/pNvtBHw

最新更新