XSLT сортировка подэлемента - PullRequest
2 голосов
/ 05 марта 2009

Аналогично предыдущей сортировке подэлементов, но у меня есть несколько дополнительных слоев узлов. Я не могу понять простое расширение предыдущего ответа, который работает. Как отсортировать подэлемент XML с помощью 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>

Ответы [ 3 ]

2 голосов
/ 06 марта 2009

Существует небольшая проблема с кодом Дэвида :

Как написано, 120 придет после 90, хотя порядок сортировки указан как descending.

Правильный способ сортировки с помощью числовых ключей сортировки показан ниже:

<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>

Обратите внимание на использование атрибута data-type из xsl:sort.

2 голосов
/ 05 марта 2009

Будет ли это работать?

<xsl:apply-templates select="Hit">
    <xsl:sort select="Hit_hsps/Hsp/Hsp_score" order="descending"/>
</xsl:apply-templates>
1 голос
/ 05 марта 2009

Проверено кодом Дэвида.

Это будет работать.

<xsl:apply-templates select="Hit">
    <xsl:sort select="Hit_hsps/Hsp/Hsp_score" data-type="number" order="descending"/>
</xsl:apply-templates>

Документация W3 согласуется.

РЕДАКТИРОВАТЬ: Добавлен атрибут типа данных Димитре. Спасибо, Димитр!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...