Я хотел бы сгруппировать элементы по первой букве, но некоторые разные буквы следует считать равными: A и Ä (а также a и ä) должны быть одинаковыми.
Источник:
<root>
<entry name="Aa" />
<entry name="Ab" />
<entry name="Äa" />
<entry name="Ac" />
<entry name="Ba" />
</root>
Преобразование:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:output indent="yes"/>
<xsl:template match="root">
<root>
<xsl:for-each-group select="entry" group-by="upper-case(substring(@name,1,1))">
<key><xsl:value-of select="current-grouping-key()"/></key>
</xsl:for-each-group>
</root>
</xsl:template>
</xsl:stylesheet>
Результат сейчас:
<root>
<key>A</key>
<key>Ä</key>
<key>B</key>
</root>
Результат такой, какой хотелось бы:
<root>
<key>A</key>
<key>B</key>
</root>
Где все записи, кроме «Bb», должны быть в первой группе.
Я предполагаю, что ключ к успеху - это сделать функцию group-by()
правильной для обработки a, A, ä и Ä равными (это верно для некоторых немецких правил сортировки / упорядочения). Но я не нашел функции xpath, которая могла бы справиться с этим.
substring(normalize-unicode(upper-case(@name),'NFD'),1,1)
- person topskip   schedule 16.05.2012