如何使用XSLT转换/翻译/替换“[A-Z]”、“[1-26]”
嗨,我需要翻译/转换/替换如何使用XSLT转换/翻译/替换“[A-Z]”、“[1-26]”,xslt,xslt-1.0,Xslt,Xslt 1.0,嗨,我需要翻译/转换/替换 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ''1234567891011121314151617181920212223242526' first i am translating <xsl:variable name="lowercase2uppercase" select="translate($mystring,'abcdefghijklmnopqrstuv
'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ''1234567891011121314151617181920212223242526'
first i am translating
<xsl:variable name="lowercase2uppercase"
select="translate($mystring,'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')"/>
在这里,我需要将这些“ABCDEFGHIJKLMNOPQRSTUVWXYZ”翻译成“123456789101121314151617181920212232526”。
例如字母“A”,“B”到“Z”,我是这样翻译的
<xsl:when test="$letter='A'">
<xsl:attribute name="letter">01</xsl:attribute>
</xsl:when>
<xsl:when test="$letter='B'">
<xsl:attribute name="letter">02</xsl:attribute>
</xsl:when>
<xsl:when test="$letter='j'">
<xsl:attribute name="letter">10</xsl:attribute>
</xsl:when>
.........## Heading ##
<xsl:when test="$letter='Z'">
<xsl:attribute name="letter">26</xsl:attribute>
</xsl:when>
在这里,我可以这样做,但是解决方案太长了,我需要一个通用的解决方案来使用XSLT将[a-Z]替换为[1-26]。
请帮帮我。
如果我的$letter是'j',它给出的是00而不是10,同样的,对于't',它也给出的是10而不是20。如果你定义一个变量,就像这样
<xsl:variable name="replace" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'" />
然后你可以简化一个字母的“翻译”,就像这样
<xsl:value-of select="string-length(substring-before($replace, $letter)) + 1" />
要对整个字符串执行此操作,可以使用递归模板,每次替换一个字母
试试这个XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:variable name="replace" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'" />
<xsl:template match="word" >
<xsl:copy>
<xsl:call-template name="translate">
<xsl:with-param name="text" select="." />
</xsl:call-template>
</xsl:copy>
</xsl:template>
<xsl:template name="translate">
<xsl:param name="text" />
<xsl:if test="$text != ''">
<xsl:variable name="letter" select="substring($text, 1, 1)" />
<xsl:value-of select="string-length(substring-before($replace, $letter)) + 1" />
<xsl:call-template name="translate">
<xsl:with-param name="text" select="substring($text, 2, string-length($text) -1 )" />
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
当应用于此XML时
<word>ABCDEFGHIJKLMNOPQRSTUVWXYZ</word>
以下是输出
<word>1234567891011121314151617181920212223242526</word>
如果你定义一个变量,就像这样
<xsl:variable name="replace" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'" />
然后你可以简化一个字母的“翻译”,就像这样
<xsl:value-of select="string-length(substring-before($replace, $letter)) + 1" />
要对整个字符串执行此操作,可以使用递归模板,每次替换一个字母
试试这个XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:variable name="replace" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'" />
<xsl:template match="word" >
<xsl:copy>
<xsl:call-template name="translate">
<xsl:with-param name="text" select="." />
</xsl:call-template>
</xsl:copy>
</xsl:template>
<xsl:template name="translate">
<xsl:param name="text" />
<xsl:if test="$text != ''">
<xsl:variable name="letter" select="substring($text, 1, 1)" />
<xsl:value-of select="string-length(substring-before($replace, $letter)) + 1" />
<xsl:call-template name="translate">
<xsl:with-param name="text" select="substring($text, 2, string-length($text) -1 )" />
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
当应用于此XML时
<word>ABCDEFGHIJKLMNOPQRSTUVWXYZ</word>
以下是输出
<word>1234567891011121314151617181920212223242526</word>
使用这个功能怎么样
normalize-space(concat(
translate($letter, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
'00000000011111111112222222'),
translate($letter, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
'12345678901234567890123456')))
它仍然相当简洁,并且可以满足您的需要- 使用这个函数怎么样
normalize-space(concat(
translate($letter, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
'00000000011111111112222222'),
translate($letter, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
'12345678901234567890123456')))
它仍然相当简洁,并且可以满足您的需要- 谢谢,它适用于除10和20以外的所有情况。如果我的$letter由j组成,它给出的是00而不是10,就像“t”的智者一样,它也给出了10而不是20。你能像01 10@user3549914这样简化它吗?如果你分解了表达式的实际功能,你会看到自己的修复方法。translate函数将第一个字符串中的每个字符替换为第二个字符串中相同位置的字符。第一个翻译处理两位数的第一个数字,如果只有一位数,则处理空格。前九个字母没有第一个数字,后十个字母的数字必须是1,其余七个字母的数字必须是2。@user3549914这个函数有一个输入错误,我现在已经修复了。请再试一次。@michael.hor257k:谢谢您的修复!谢谢,它适用于除10和20以外的所有情况。如果我的$letter由j组成,它给出的是00而不是10,就像“t”的智者一样,它也给出了10而不是20。你能像01 10@user3549914这样简化它吗?如果你分解了表达式的实际功能,你会看到自己的修复方法。translate函数将第一个字符串中的每个字符替换为第二个字符串中相同位置的字符。第一个翻译处理两位数的第一个数字,如果只有一位数,则处理空格。前九个字母没有第一个数字,后十个字母的数字必须是1,其余七个字母的数字必须是2。@user3549914这个函数有一个输入错误,我现在已经修复了。请再试一次。@michael.hor257k:谢谢您的修复!