У меня есть этот 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>
С помощью следующего XSLT я могу получить пептиды с «присоединением» «111», исключая избыточность последовательностей.Так что я получаю этот XML
<root>
<peptide>
<accession>111</accession>
<sequence>AAA</sequence>
<score>4000</score>
</peptide>
<peptide>
<accession>111</accession>
<sequence>BBB</sequence>
<score>5000</score>
</peptide>
</root>
Вот это 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: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="key('byAcc','111')
[
generate-id()
=
generate-id(key('byAccSeq', concat(accession, '|', sequence))[1])
]">
<xsl:sort select="sequence" data-type="text"/>
<xsl:sort select="score" data-type="number"/>
</xsl:apply-templates>
</root>
</xsl:template>
<xsl:template match="/data/peptides/peptide">
<xsl:copy-of select="."/>
</xsl:template>
</xsl:stylesheet>
И живой пример здесь
Тогда проблемазаключается в том, что из всей избыточности «выбранный» узел является только первым, который появляется в исходном XML.
Мне нужно выбрать из всех избыточных пептидов (то есть тех, которые имеют одинаковое присоединение и последовательность), тот, который набрал максимальное количество баллов.
Желаемый XML был бы таким, тогда
<root>
<peptide>
<accession>111</accession>
<sequence>AAA</sequence>
<score>6000</score>
</peptide>
<peptide>
<accession>111</accession>
<sequence>BBB</sequence>
<score>8000</score>
</peptide>
</root>
Если неясно, пожалуйста, дайте мне знать, и я заново отредактирую вопрос.Большое спасибо.
Джерард