我有一个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>
此转换:
<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
指令的文档顺序。