我有以下XML代码:
<module>
<component>
<output>
<output-test>
<exclude-output/>
<orderEntry type="specific"/>
<orderEntry type="other"/>
<orderEntry type="module" module-name="module1"/>
<orderEntry type="module" module-name="module3"/>
<orderEntry type="module" module-name="module2"/>
<orderEntry type="library" name="library1"/>
<orderEntry type="library" name="library3"/>
<orderEntry type="module" module-name="module4"/>
<orderEntry type="library" name="library2"/>
</component>
</module>
我想要输出:
<module>
<component>
<output>
<output-test>
<exclude-output/>
<orderEntry type="specific"/>
<orderEntry type="other"/>
<orderEntry type="module" module-name="module1"/>
<orderEntry type="module" module-name="module2"/>
<orderEntry type="module" module-name="module3"/>
<orderEntry type="module" module-name="module4"/>
<orderEntry type="library" name="library1"/>
<orderEntry type="library" name="library2"/>
<orderEntry type="library" name="library3"/>
</component>
</module>
我不完全确定这是否符合您的要求,但是您可以在单独的xsl:apply-templates
中明确选择要首先出现的那些,然后选择其他的,并对其type
属性进行排序
<xsl:apply-templates select="orderEntry[@type='specific' or @type='other']" />
<xsl:apply-templates select="orderEntry[@type!='specific' and @type!='other']">
<xsl:sort select="@type" order="descending" />
<xsl:sort select="@module-name" order="ascending" />
<xsl:sort select="@name" order="ascending" />
</xsl:apply-templates>
查看当前的预期输出,似乎所有type
属性都按降序排列,因此您可以将其简化为:
<xsl:apply-templates select="orderEntry">
<xsl:sort select="@type" order="descending" />
<xsl:sort select="@module-name" order="ascending" />
<xsl:sort select="@name" order="ascending" />
</xsl:apply-templates>
试试这个 XSLT
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="xml" indent="yes" />
<xsl:strip-space elements="*" />
<xsl:template match="component">
<xsl:copy>
<xsl:apply-templates select="@*|node()[not(self::orderEntry)]"/>
<xsl:apply-templates select="orderEntry">
<xsl:sort select="@type" order="descending" />
<xsl:sort select="@module-name" order="ascending" />
<xsl:sort select="@name" order="ascending" />
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
请注意,如果您实际上想按不按字母顺序排列type
属性进行排序,则可以执行以下操作:
<xsl:apply-templates select="orderEntry">
<xsl:sort select="string-length(substring-before('specific,other,module,library',@type))" order="ascending" />
<xsl:sort select="@module-name" order="ascending" />
<xsl:sort select="@name" order="ascending" />
</xsl:apply-templates>