我有一个XML结构,看起来像这样 -
<Root>
<name rank = "1">ABC
<name rank ="1">BCD</name>
</name>
<name rank ="0">XYZ
<name rank ="1">BCD</name>
<name rank ="3">YYZ</name>
<name rank ="0">FEG</name>
<name rank ="0">DEG</name>
</name>
</Root>
我希望通过复制它来保存层次结构并按顺序对其进行排序来转换此XML (1)按排名(升序) (2)如果等级相等,则按名称(升序)对其进行排序
转换后,结构应如下所示。
<Root>
<name rank ="0">XYZ
<name rank ="0">DEG</name>
<name rank ="0">FEG</name>
<name rank ="1">BCD</name>
<name rank ="3">YYZ</name>
</name>
<name rank = "1">ABC
<name rank ="1">BCD</name>
</name>
</Root>
我有以下XSL,它不保留层次结构或给我正确的排序。有人可以帮帮我吗?这是我第一次使用XSL,并希望得到正确方向的任何帮助或指示。
<xsl:template match="/*">
<xsl:copy>
<xsl:for-each select="//name">
<xsl:sort select="@rank" data-type="number" order="ascending"/>
<xsl:sort select="name" order="ascending" />
<xsl:copy-of select="."/>
</xsl:for-each>
</xsl:copy>
</xsl:template>
答案 0 :(得分:0)
此转化:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/*">
<Root>
<xsl:apply-templates select="name">
<xsl:sort select="@rank" data-type="number"/>
<xsl:sort/>
</xsl:apply-templates>
</Root>
</xsl:template>
<xsl:template match="name">
<name rank="{@rank}">
<xsl:copy-of select="text()"/>
<xsl:apply-templates select="name">
<xsl:sort select="@rank" data-type="number"/>
<xsl:sort/>
</xsl:apply-templates>
</name>
</xsl:template>
</xsl:stylesheet>
应用于提供的XML文档:
<Root>
<name rank = "1">ABC
<name rank ="1">BCD</name>
</name>
<name rank ="0">XYZ
<name rank ="1">BCD</name>
<name rank ="3">YYZ</name>
<name rank ="0">FEG</name>
<name rank ="0">DEG</name>
</name>
</Root>
生成想要的正确结果:
<Root>
<name rank="0">XYZ
<name rank="0">DEG</name>
<name rank="0">FEG</name>
<name rank="1">BCD</name>
<name rank="3">YYZ</name></name>
<name rank="1">ABC
<name rank="1">BCD</name></name>
</Root>
<强>解释强>:
使用两条xsl:sort
说明。排序操作的优先级对应于相应xsl:sort
指令的文档顺序。