与之前的子元素排序类似,但我有一些额外的节点层。我无法弄清楚上一个有效的答案的简单扩展。 How to sort a subelement of XML with XSLT
简化输入示例:
<Iteration>
<Iteration_query-ID>NODE_10008</Iteration_query-ID>
<Iteration_query-def>NODE_10008</Iteration_query-def>
<Iteration_query-len>339</Iteration_query-len>
<Iteration_hits>
<Hit>
<Hit_id>110679166</Hit_id>
<Hit_def>[Roseobacter litoralis Och 149]</Hit_def>
<Hit_len>68</Hit_len>
<Hit_hsps>
<Hsp>
<Hsp_score>300.0</Hsp_score>
<Hsp_evalue>4.94413E-26</Hsp_evalue>
<Hsp_query-from>69</Hsp_query-from>
<Hsp_query-to>272</Hsp_query-to>
</Hsp>
</Hit_hsps>
</Hit>
<Hit>
<Hit_id>114767284</Hit_id>
<Hit_def>[Roseovarius sp. HTCC2601]</Hit_def>
<Hit_len>68</Hit_len>
<Hit_hsps>
<Hsp>
<Hsp_bit-score>127.487</Hsp_bit-score>
<Hsp_score>319.0</Hsp_score>
<Hsp_evalue>3.0968E-28</Hsp_evalue>
<Hsp_query-from>69</Hsp_query-from>
<Hsp_query-to>272</Hsp_query-to>
</Hsp>
</Hit_hsps>
</Hit>
</Iteration_hits>
</Iteration>
我想按其中一个Hsp属性排序,例如Hsp_score。我已经能够对它进行排序,但我无法弄清楚如何防止它丢弃一些Hit节点:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:import href="identity.xsl"/>
<!--
Iteration/Iteration_hits/Hit/Hit_hsps/Hsp
-->
<xsl:template match="Iteration_hits">
<xsl:copy>
<xsl:apply-templates select="Hit/Hit_hsps/Hsp">
<xsl:sort select="Hsp_score" order="descending"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
答案 0 :(得分:2)
这会有用吗?
<xsl:apply-templates select="Hit">
<xsl:sort select="Hit_hsps/Hsp/Hsp_score" order="descending"/>
</xsl:apply-templates>
答案 1 :(得分:2)
David的代码存在轻微的问题:
如上所述,虽然排序顺序指定为descending
,但在 90之后<120>会出现。
使用数字排序键进行排序的正确方法如下所示:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<!-- -->
<xsl:param name="pNewType" select="'myNewType'"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<!-- -->
<xsl:template match="Iteration_hits">
<xsl:copy>
<xsl:apply-templates select="Hit">
<xsl:sort select="Hit_hsps/Hsp/Hsp_score"
data-type="number"
order="descending"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
应用于此XML文档时:
<Iteration>
<Iteration_query-ID>NODE_10008</Iteration_query-ID>
<Iteration_query-def>NODE_10008</Iteration_query-def>
<Iteration_query-len>339</Iteration_query-len>
<Iteration_hits>
<Hit>
<Hit_id>110679166</Hit_id>
<Hit_def>[Roseobacter litoralis Och 149]</Hit_def>
<Hit_len>68</Hit_len>
<Hit_hsps>
<Hsp>
<Hsp_score>120.0</Hsp_score>
<Hsp_evalue>4.94413E-26</Hsp_evalue>
<Hsp_query-from>69</Hsp_query-from>
<Hsp_query-to>272</Hsp_query-to>
</Hsp>
</Hit_hsps>
</Hit>
<Hit>
<Hit_id>114767284</Hit_id>
<Hit_def>[Roseovarius sp. HTCC2601]</Hit_def>
<Hit_len>68</Hit_len>
<Hit_hsps>
<Hsp>
<Hsp_bit-score>127.487</Hsp_bit-score>
<Hsp_score>90.0</Hsp_score>
<Hsp_evalue>3.0968E-28</Hsp_evalue>
<Hsp_query-from>69</Hsp_query-from>
<Hsp_query-to>272</Hsp_query-to>
</Hsp>
</Hit_hsps>
</Hit>
</Iteration_hits>
</Iteration>
产生了正确的结果:
<Iteration>
<Iteration_query-ID>NODE_10008</Iteration_query-ID>
<Iteration_query-def>NODE_10008</Iteration_query-def>
<Iteration_query-len>339</Iteration_query-len>
<Iteration_hits><Hit>
<Hit_id>110679166</Hit_id>
<Hit_def>[Roseobacter litoralis Och 149]</Hit_def>
<Hit_len>68</Hit_len>
<Hit_hsps>
<Hsp>
<Hsp_score>120.0</Hsp_score>
<Hsp_evalue>4.94413E-26</Hsp_evalue>
<Hsp_query-from>69</Hsp_query-from>
<Hsp_query-to>272</Hsp_query-to>
</Hsp>
</Hit_hsps>
</Hit><Hit>
<Hit_id>114767284</Hit_id>
<Hit_def>[Roseovarius sp. HTCC2601]</Hit_def>
<Hit_len>68</Hit_len>
<Hit_hsps>
<Hsp>
<Hsp_bit-score>127.487</Hsp_bit-score>
<Hsp_score>90.0</Hsp_score>
<Hsp_evalue>3.0968E-28</Hsp_evalue>
<Hsp_query-from>69</Hsp_query-from>
<Hsp_query-to>272</Hsp_query-to>
</Hsp>
</Hit_hsps>
</Hit></Iteration_hits>
</Iteration>
请注意使用xsl:sort
的 data-type
属性。
答案 2 :(得分:1)
测试大卫的代码。
这样可行。
<xsl:apply-templates select="Hit">
<xsl:sort select="Hit_hsps/Hsp/Hsp_score" data-type="number" order="descending"/>
</xsl:apply-templates>
编辑:添加了Dimitre的数据类型属性。谢谢Dimitre!