如何转换/翻译/替换' [A-Z]' ' [1-26]'使用XSLT

时间:2014-04-18 19:11:03

标签: xslt xslt-1.0

您好我需要翻译/转换/替换

'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ''1234567891011121314151617181920212223242526' 
first i am translating
 <xsl:variable name="lowercase2uppercase"
            select="translate($mystring,'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')"/>

这里我需要将'ABCDEFGHIJKLMNOPQRSTUVWXYZ'翻译成'1234567891011121314151617181920212223242526'。 例如字母'A','B'到'Z'i正在翻译这样

<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]。 请帮我 。 如果my $letter'j',那么't'同样给予00而不是10,而是给出10而不是20。

2 个答案:

答案 0 :(得分:3)

如何使用此功能?

normalize-space(concat(
                translate($letter, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 
                                   '00000000011111111112222222'), 
                translate($letter, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 
                                   '12345678901234567890123456')))

它仍然非常简洁,它可以满足您的需求。 : - )

答案 1 :(得分:2)

好吧,如果你定义一个变量,就像这样......

<xsl:variable name="replace" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'" />

然后你可以简化翻译&#39;一封信,就像这样

<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>