У меня есть файл XML с группой узлов protein
, каждый из которых имеет номер accession
. И группа из peptides
каждого из них с параметрами accession
, sequence
, RT
и score
.
И у меня есть XSLT-файл, в котором для каждого белка вызываются все пептидные узлы с одинаковым accession
номером белка.
Затем, в зависимости от значения переменной, здесь <xsl:param name="analysis" select="0"/>
, файл XSLT вызывает все пептиды, которые имеют одинаковый номер accession
, или все пептиды, которые имеют один и тот же номер accession
, но отбрасывают все те, которые имеют совпадающие значения sequence
.
Вот код, который делает то, что я сказал (изменив значение переменной с 0 на 1, можно увидеть 2 ситуации, которые я описал)
Я также вставляю код в конце поста
Теперь мне нужно отсортировать и выбрать пептидные узлы с максимальным количеством баллов.
Таким образом, в случае, когда файл XSLT вызывает все пептиды, которые имеют один и тот же номер accession
, мне нужно, чтобы они были отсортированы в зависимости от их значений оценки.
И в случае, когда код вызывает все пептиды с одинаковым числом accession
, но выбирает только один пептид из тех, которые также имеют одинаковые последовательности, мне нужно, чтобы этот пептид был максимальным, а не только первым. входит в файл XML.
Я попытался использовать функцию "сортировки" в этом коде ссылка, но если вы возьмете взглянув на это, вы увидите, что выходные данные XML упорядочивают все пептиды, теряя предыдущую предварительную группировку, выполненную с помощью оператора key
.
XML-код
<data>
<proteins>
<protein>
<accession>111</accession>
</protein>
</proteins>
<peptides>
<peptide>
<accession>111</accession>
<sequence>AAA</sequence>
<RT>13</RT>
<score>4000</score>
</peptide>
<peptide>
<accession>111</accession>
<sequence>AAA</sequence>
<RT>14</RT>
<score>6000</score>
</peptide>
<peptide>
<accession>111</accession>
<sequence>AAA</sequence>
<RT>15</RT>
<score>5000</score>
</peptide>
<peptide>
<accession>111</accession>
<sequence>BBB</sequence>
<RT>23</RT>
<score>5000</score>
</peptide>
<peptide>
<accession>111</accession>
<sequence>BBB</sequence>
<RT>24</RT>
<score>1000</score>
</peptide>
<peptide>
<accession>111</accession>
<sequence>BBB</sequence>
<RT>25</RT>
<score>8000</score>
</peptide>
<peptide>
<accession>111</accession>
<sequence>BBB</sequence>
<RT>26</RT>
<score>5000</score>
</peptide>
</peptides>
</data>
XSLT-код
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
<xsl:param name="analysis" select="0"/>
<xsl:key name="byAcc" match="/data/peptides/peptide" use="accession" />
<xsl:key name="byAccSeq" match="/data/peptides/peptide" use="concat(accession, '|', sequence)"/>
<xsl:template match="/">
<root>
<name>
<xsl:value-of select="$analysis"/>
</name>
<xsl:apply-templates select="/data/proteins/protein" />
</root>
</xsl:template>
<xsl:template match="/data/proteins/protein">
<xsl:choose>
<xsl:when test="$analysis=1">
<xsl:apply-templates select="key('byAcc',accession)">
</xsl:apply-templates>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="key('byAcc',accession)[
generate-id()
=
generate-id(key('byAccSeq', concat(accession, '|', sequence)))]">
</xsl:apply-templates>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="/data/peptides/peptide">
<xsl:copy-of select="."/>
</xsl:template>
</xsl:stylesheet>
И вывод XML, который мне нужен, для простоты, когда выбран только один пептид <xsl:param name="analysis" select="0"/>
<root>
<name>0</name>
<peptide>
<accession>111</accession>
<sequence>AAA</sequence>
<RT>14</RT>
<score>6000</score>
</peptide>
<peptide>
<accession>111</accession>
<sequence>BBB</sequence>
<RT>25</RT>
<score>8000</score>
</peptide>
</root>
Это из двух пептидных узлов, которые имеют общие значения accession
и sequence
, те, у которых максимальное значение score
Спасибо
---------------------------------------------------------------------------
РЕДАКТИРОВАТЬ: Попытка сделать вопрос более ясным
Самый упрощенный код, который я могу придумать, будет таким:
У меня есть этот XML-код
<data>
<peptides>
<peptide>
<accession>111</accession>
<sequence>AAA</sequence>
<score>4000</score>
</peptide>
<peptide>
<accession>111</accession>
<sequence>AAA</sequence>
<score>6000</score>
</peptide>
<peptide>
<accession>111</accession>
<sequence>AAA</sequence>
<score>5000</score>
</peptide>
<peptide>
<accession>111</accession>
<sequence>BBB</sequence>
<score>5000</score>
</peptide>
<peptide>
<accession>111</accession>
<sequence>BBB</sequence>
<score>1000</score>
</peptide>
<peptide>
<accession>111</accession>
<sequence>BBB</sequence>
<score>8000</score>
</peptide>
<peptide>
<accession>111</accession>
<sequence>BBB</sequence>
<score>5000</score>
</peptide>
<peptide>
<accession>222</accession>
<sequence>CCC</sequence>
<score>5000</score>
</peptide>
<peptide>
<accession>222</accession>
<sequence>CCC</sequence>
<score>9000</score>
</peptide>
<peptide>
<accession>222</accession>
<sequence>CCC</sequence>
<score>2000</score>
</peptide>
</peptides>
</data>
не предполагая, что способ сортировки непротиворечив, так что этот XML может иметь узлы в любом положении.
Затем я хочу сгруппировать узлы сначала по присоединению, затем внутри этих узлов, чтобы сгруппировать их по последовательности, а затем внутри этих узлов, чтобы отсортировать их по количеству баллов.
Таким образом, выходной XML будет таким
<data>
<peptides>
<peptide>
<accession>111</accession>
<sequence>AAA</sequence>
<score>6000</score>
</peptide>
<peptide>
<accession>111</accession>
<sequence>AAA</sequence>
<score>5000</score>
</peptide>
<peptide>
<accession>111</accession>
<sequence>AAA</sequence>
<score>4000</score>
</peptide>
<peptide>
<accession>111</accession>
<sequence>BBB</sequence>
<score>8000</score>
</peptide>
<peptide>
<accession>111</accession>
<sequence>BBB</sequence>
<score>5000</score>
</peptide>
<peptide>
<accession>111</accession>
<sequence>BBB</sequence>
<score>5000</score>
</peptide>
<peptide>
<accession>111</accession>
<sequence>BBB</sequence>
<score>1000</score>
</peptide>
<peptide>
<accession>222</accession>
<sequence>CCC</sequence>
<score>9000</score>
</peptide>
<peptide>
<accession>222</accession>
<sequence>CCC</sequence>
<score>5000</score>
</peptide>
<peptide>
<accession>222</accession>
<sequence>CCC</sequence>
<score>2000</score>
</peptide>
</peptides>
</data>
РЕШЕНИЕ для этого последнего кода из любезно предоставленного ответа:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
<xsl:key name="byAcc" match="/data/peptides/peptide" use="accession" />
<xsl:key name="byAccSeq" match="/data/peptides/peptide" use="concat(accession, '|', sequence)"/>
<xsl:template match="/">
<root>
<xsl:apply-templates select="/data/proteins/protein">
</xsl:apply-templates>
</root>
</xsl:template>
<xsl:template match="/data/proteins/protein">
<xsl:apply-templates select="key('byAcc',accession)">
<xsl:sort select="sequence" data-type="text"/>
<xsl:sort select="score" data-type="number"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="/data/peptides/peptide">
<xsl:copy-of select="."/>
</xsl:template>
</xsl:stylesheet>
проверьте здесь
score
) - первое из двух решений в моем ответе. - person Dimitre Novatchev   schedule 18.12.2011