十六进制字符串上的xslt变换

时间:2012-08-01 13:43:29

标签: xml xslt xslt-1.0

我必须以一种特殊的方式转换我的字符串,因为字符串包含许多十六进制值,并且必须根据某些条件应用替换。

我的字符串包含十六进制值。

总是字符串的长度,是18的倍数。字符串可以包含1 * 18到5000 * 18次(1组到5000组)。

现在我的输出是基于以下条件的转换字符串

1) Check if the groups 13th character is 4e(13th and 14th character)


  Then, change such a way that starting from 7th to 10th character(4 chars) of the string, from whatever the value is to '4040'


    Also change starting from 11th till 16th(6 chars) to '4ef0f0'
    The 17th and 18th to be '4040'

   The whole group to be changed based on the above


2) If the check fails, no change for the group

示例如果我的输入字符串是 - 一个组,第12和第13个是'4e'

<xsl:variable name="inputstringhex"
      select="'005f6f7e8f914e7175'"/>

应转换为

'005f6f40404ef0f04040'

我正在使用xslt1.0,我只能使用Divide和conquer方法(如果使用了任何递归),因为如果使用了尾递归方法,我的xslt处理器会出错,大量数据。

1 个答案:

答案 0 :(得分:1)

你可以使用二进制日志递归(也许这就是你所说的分而治之??无论如何,这个XSLT 1.0样式表......

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*" />

<xsl:variable name="inputstringhex"
      select="'005f6f7e8f914e717512346f7e8f914e7175'"/>

<xsl:template match="/">
  <t>
    <xsl:call-template name="string18s">
      <xsl:with-param name="values" select="$inputstringhex" />
    </xsl:call-template>
  </t>  
</xsl:template>

<xsl:template name="string18s">
  <xsl:param name="values" />
  <xsl:variable name="value-count" select="string-length($values) div 18" />
  <xsl:choose>
    <xsl:when test="$value-count = 0" />
    <xsl:when test="$value-count &gt;= 2">
      <xsl:variable name="half-way" select="floor( $value-count div 2) * 18" />
      <xsl:call-template name="string18s">
        <xsl:with-param name="values" select="substring( $values, 1, $half-way)" />
      </xsl:call-template>
      <xsl:call-template name="string18s">
        <xsl:with-param name="values" select="substring( $values,
         $half-way+1, string-length($values) - $half-way)" />
      </xsl:call-template>      
    </xsl:when>  
    <xsl:otherwise>
      <xsl:call-template name="process-one-string18">
        <xsl:with-param name="value" select="$values" />
      </xsl:call-template>
    </xsl:otherwise>  
  </xsl:choose>
</xsl:template>

<xsl:template name="process-one-string18">
  <xsl:param name="value" />
  <v>
   <xsl:choose>
    <xsl:when test="substring( $value, 13, 2) = '4e'"> 
      <xsl:value-of select="concat( substring( $value, 1, 6),
                                    '40404ef0f04040')" />
    </xsl:when> 
    <xsl:otherwise>
      <xsl:value-of select="$value" />
    </xsl:otherwise> 
   </xsl:choose>
  </v>  
</xsl:template>

</xsl:stylesheet>

...将产生此输出......

<t>
  <v>005f6f40404ef0f04040</v>
  <v>12346f40404ef0f04040</v>
</t> 

根据需要调整或连接输出值。输入是$ inputstringhex变量内容。使用此解决方案,只能在13级递归中处理5000 * 18长度的输入字符串。