Как отмечает Тим Робинсон, translate
сделает свое дело. (Я бы не назвал это «взломом», но тогда я уже давно нахожусь на стадии «отождествление с моими пытателями» в моих отношениях с XSLT.) Ваш код будет намного более читабельным, если вы будете использовать что-то подобное :
<xsl:variable name="uc" value="ABCDEFGHIJKLMNOPQRSTUVWXYZ"/>
<xsl:variable name="lc" value="abcdefghijklknopqrstuvwxyz"/>
<xsl:variable name="ws" value=" 	"/>
... который является частью файла globals.xslt
, который я включаю в начало большинства преобразований, которые я пишу. Тогда это:
<xsl:value-of select="translate(x, concat($uc, $ws), $lc)"/>
переводит каждую заглавную букву в ее строчный эквивалент, а каждый символ пробела - в ничто.
Обычно причина, по которой вы используете xsl:variable
, состоит в том, чтобы сделать код более читабельным (как в приведенном выше примере) или сохранить промежуточные результаты, которые иначе невозможно эффективно рассчитать. Четвертый способ получения данных на выходе - это тот, который вы не упомянули, и это чертовски полезно: шаблон значения атрибута. Все они делают одно и то же:
<link>
<xsl:attribute name="name">
<xsl:value-of select="translate(name, concat($uc, $ws), $lc)"/>
</xsl:attribute>
</link>
<link>
<xsl:attribute name="name" value="translate(name, concat($uc, $ws), $lc)"/>
</link>
<xsl:variable name="linkName" value="translate(name, concat($uc, $ws), $lc)"/>
<link name="{$linkName}"/>
В данном конкретном случае можно утверждать, что из двух последних проще и понятнее. Однако в большинстве случаев это не так: отделение вычисления значений от того, как они вставляются в вывод, облегчает понимание обоих, как и использование AVT вместо более многословных конструкций XSLT, которые делают то же самое.