У меня есть XML-документ, содержащий элементы, каждый из которых имеет строку идентифицированного токена.
<?xml version="1.0"?>
<Test>
<Items>
<Item>
<ID>1_A_3</ID>
<Name>foo</Name>
</Item>
<Item>
<ID>1_B_5</ID>
<Name>bar</Name>
</Item>
<Item>
<ID>1_B_7</ID>
<Name>baz</Name>
</Item>
</Items>
</Test>
Мне нужно преобразовать это в другой XML-документ, который группирует элементы в соответствии с middle часть их строки идентификатора (буква в приведенном выше примере).
<?xml version='1.0' ?>
<GroupedItems>
<Group id="A">
<Item>foo</Item>
</Group>
<Group id="B">
<Item>bar</Item>
<Item>baz</Item>
</Group>
</GroupedItems>
Я нахожу группы, используя функциональность клавиш:
<xsl:key name="uniqueGroupIDs"
match="Test/Items/Item"
use="substring-before(substring-after(ID,'_'),'_')"/>
<xsl:for-each
select="Test/Items/Item[generate-id() =
generate-id(key('uniqueGroupIDs',
substring-before(substring-after(ID,'_'),'_')))]">
Обратите внимание на дублирование кода вызовов подстрокив обоих местах.У меня уже есть шаблон, который делает то же самое:
<xsl:template name="ExtractGroupID">
<xsl:param name="idString"/>
<xsl:value-of
select="substring-before(substring-after($idString, '_'),'_')"/>
</xsl:template>
Есть ли способ использовать этот шаблон в ключевых выражениях, чтобы избежать дублирования кода?
В XSLT 2.0 IЯ бы просто определил функцию для этого, но я застрял с XSLT 1.0 из-за ограничений инструментов, которые я не могу контролировать.