У меня есть следующий xml-файл.
<Bank>
<Person personId="1" type="1071" deleted="0">
</Person>
<Person personId="2" type="1071" deleted="0">
</Person>
<Person personId="3" type="1071" deleted="0">
</Person>
<Account>
<Role personId="1" type="1025" />
</Account>
<Account>
<Role personId="1" type="1025" />
</Account>
<Account>
<Role personId="1" type="1018" />
</Account>
<Account>
<Role personId="3" type="1025" />
<Role personId="1" type="1018" />
</Account>
<Account>
<Role personId="2" type="1025" />
</Account>
</Bank>
и следующее преобразование xsl.
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="ISO-8859-1" />
<xsl:strip-space elements="*" />
<xsl:key name="roleKey"
match="Role[(@type = '1025' or @type = '1018' or @type = '1022' or @type = '1023') and not(@validTo)]"
use="@personId" />
<xsl:template match="Person">
<xsl:value-of select="@personId" />
<xsl:variable name="roles" select="key('roleKey', @personId)" />
<xsl:for-each select="$roles">
<xsl:text>;</xsl:text><xsl:value-of select="@type" />
</xsl:for-each>
<xsl:text>
</xsl:text>
</xsl:template>
</xsl:stylesheet>
Фактический результат следующий, и я хотел бы удалить повторяющиеся значения type
.
1;1025;1025;1018;1018
2;1025
3;1025
Ожидаемые результаты должны быть такими...
1;1025;1018
2;1025
3;1025
Я испробовал советы по ключевому слову following
с этого веб-сайта, а также трюк по мюнхенскому методу. Все они не работают, поскольку они, кажется, просматривают весь документ и сопоставляют дубликаты для каждого элемента Person
, тогда как я хочу удалить дубликаты только в контексте Person
, определенном атрибутом personId
.
Как удалить эти дубликаты из пакета, возвращаемого функцией key
? Или, может быть, есть метод, который я могу использовать в xsl:for-each
для печати только того, что я хочу?
Я могу использовать только то, что доступно в XSLT 1.0. У меня нет возможности использовать процессор XSLT 2.0.