Предполагая, что в имени элемента будет не более одного _
разделителя, и предполагая, что имена не содержат не-ASCII символов, вы можете использовать:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="*">
<xsl:param name="upper-case" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'"/>
<xsl:param name="lower-case" select="'abcdefghijklmnopqrstuvwxyz'"/>
<xsl:variable name="name" select="name()" />
<xsl:variable name="word2" select="substring-after($name, '_')" />
<xsl:variable name="new-name">
<xsl:value-of select="translate(substring-before(concat($name, '_'), '_'), $upper-case, $lower-case)"/>
<xsl:value-of select="translate(substring($word2, 1, 1), $lower-case, $upper-case)"/>
<xsl:value-of select="translate(substring($word2, 2), $upper-case, $lower-case)"/>
</xsl:variable>
<xsl:element name="{$new-name}">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
Добавлено:
Если (как кажется) вы используете процессор, который поддерживает функцию расширения XSLT str:tokenize()
, вы можете сделать:
XSLT 1.0 + EXSLT
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:str="http://exslt.org/strings"
extension-element-prefixes="str">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="*">
<xsl:param name="upper-case" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'"/>
<xsl:param name="lower-case" select="'abcdefghijklmnopqrstuvwxyz'"/>
<xsl:variable name="new-name">
<xsl:for-each select="str:tokenize(name(), '_')">
<xsl:choose>
<xsl:when test="position() = 1">
<xsl:value-of select="translate(., $upper-case, $lower-case)"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="translate(substring(., 1, 1), $lower-case, $upper-case)"/>
<xsl:value-of select="translate(substring(., 2), $upper-case, $lower-case)"/>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</xsl:variable>
<xsl:element name="{$new-name}">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
Снимает ограничение на количество разделителей _
, которое может иметь имя элемента.Остается другое ограничение: все возможные символы, которые могут присутствовать в имени элемента и имеют прописные и строчные буквы, должны быть указаны в параметрах $upper-case
и $lower-case
.