Я добавляю это к ответу Мартина Лаармана, который охватывает ваши требования 1-3 и имеет мой голос:
Чтобы удалить все, кроме определенного диапазона символов, из строки с XSLT 1.0 (ваше четвертое требование), выполните следующие действия.
<!-- declare at top level -->
<xsl:variable
name="validRange"
select="'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
/>
<!-- later, within a template… -->
<xsl:attribute name="id">
<xsl:value-of select="
concat(
'id_',
translate(
@MenuText,
translate(@MenuText, $validRange, ''),
''
)
)
" />
</xsl:attribute>
Внутренний translate()
удаляет любой действительный символ из @MenuText
, оставляя только недействительные символы. Они подаются на внешний translate()
, который теперь может удалить все недействительные символы из @MenuText
, какими бы они ни были в этом случае. Остаются только действительные символы.
Вы можете сделать из него функцию:
<xsl:template name="HtmlIdFromString">
<xsl:param name="input" select="''" />
<xsl:value-of select="
concat('id_', translate( $input, translate($input, $validRange, ''), ''))
" />
</xsl:template>
и назовите это так:
<xsl:attribute name="id">
<xsl:call-template name="HtmlIdFromString">
<xsl:with-param name="input" select="@MenuText" />
</xsl:call-template>
</xsl:attribute>