То, что отсутствует в вашей таблице стилей, - это способ идентифицировать первое в группе идентичных элементов.Следующая таблица стилей использует xsl:key
для группировки peptide
элементов путем комбинации их значений accession
и sequence
:
<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="byAccSeq" match="peptide"
use="concat(accession, '|', sequence)"/>
<xsl:template match="/">
<root><xsl:apply-templates select="/*/proteins/protein"/></root>
</xsl:template>
<xsl:template match="protein">
<xsl:apply-templates
select="../../peptides/peptide[accession=current()/accession]"/>
</xsl:template>
<xsl:template match="peptide[generate-id()=
generate-id(key('byAccSeq', concat(accession, '|', sequence))[1])]">
<xsl:copy-of select="."/>
</xsl:template>
<xsl:template match="peptide"/>
</xsl:stylesheet>
Вывод:
<root>
<peptide>
<accession>111</accession>
<sequence>AAA</sequence>
</peptide>
<peptide>
<accession>111</accession>
<sequence>BBB</sequence>
</peptide>
</root>
Объяснение: Следующая строка:
<xsl:key name="byAccSeq" match="peptide"
use="concat(., accession, sequence)"/>
... группирует peptide
элементы, используя ключи, значения которых равны concat(., accession, sequence)
.Элементы могут быть впоследствии извлечены путем воспроизведения ключа для некоторого элемента peptide
:
key('byAccSeq', concat(/path/to/peptide, accession, sequence))
Чтобы сопоставить первый элемент в списке узлов, возвращаемых для некоторого ключа, мы используем следующий шаблон / шаблон:
<xsl:template match="peptide[generate-id()=
generate-id(key('byAccSeq', concat(., accession, sequence))[1])]">
Функция generate-id
возвращает уникальный идентификатор для каждого узла в документе.Мы запрашиваем любой элемент peptide
, уникальный идентификатор которого равен уникальному идентификатору узла, который является первым в списке для некоторого ключа.
Затем мы игнорируем все остальные элементы peptide
- те, чтокоторые не являются первыми для некоторого ключа - со следующим шаблоном:
<xsl:template match="peptide"/>
Этот метод группировки называется методом Мюнхена.Дополнительное чтение: