0

I need to convert a text string contained in a variable to an XML node. The mapping to the output XML is determined by a file named 'mapping.xml'. It has bit manipulation(checking if bit is 1).

mapping.xml

<Root>
  <field no="2" charlength="2">variable</field>
  <field no="3" total="4">fixed</field>
  <field no="21" charlength="2">
    <subfield no="1" total="3">fixed</subfield>
    <subfield no="2" charlength="2" idcode="ABC">variable</subfield>
  </field>
  <field no="63" charlength="2">
    <format1>
    <subfield no="1" total="3">fixed</subfield>
    </format1>
    <format2>
      <subfield no="1" total="3">fixed</subfield>
      <subfield no="2" total="7">fixed</subfield>
    </format2>
    <format3>
      <subfield no="1" total="3">fixed</subfield>
      <subfield no="2" total="7">fixed</subfield>
      <subfield no="3" total="6">fixed</subfield>
    </format3>
  </field>
</Root>

1) The xml will have 64 'field' elements. For a sample, i have included 3 to four fields here, in the mapping xml
2) Always the string will follow the order, fields 1 to 64 in ascending.
3) The fields can be fixed or variable. Fixed means the string will be of number of characters, determined by the charlength attribute corresponding to a field
4) Some fields can have subfields
5) The subfields can have fixed and variable. All fixed ones occur first, followed by the variable subfields.
6) A field which has subfields, fixed ones(subfields) always occur, fixed one does not have idcode attributes.
7) A Field which has subfields, variable ones(subfields), start with 'idcode' attribute, followed by the charlength(determined by the charlength attribute)
8) The subfield idcodes and lengths always occur, however the data may or may not be present, depending on char length(if characters determined by charlength is 0, then the data will not be there)
9) Field no 63 is an exception, where the character length determines the format of the field. If the character is 03(number of chars 2), it is format1. If it is 10, format2, then if it is 16, format3.
9) The occurence of fields, determined by bit positions(0 means no occurence, 1 stands for occurence)
10)The bit positions is determined by another variable which holds a hex value(8 bytes - 64 bits)

My hex could be:

<xsl:variable name="hex" select="'6000080000000000'"/><!--16 digits, each digit represents fourbits-->
as illustrated below
0110 0000 0000 0000 0000 1000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000

6     0    0    0    0    8    0    0    0    0    0    0    0     0    0   0

This hex tells that fields 2, 3 and 21 are present, as those positions, we have 1(set)

If the string variable is (my input)

<xsl:variable name="inputstring" select="'013112316145ABC0812345678'"/>

The above string 16(after 1123), stands for length of chars for field 21.

My desired output:

<Root>
  <field2>3</field2>
  <!--value is 3 as the charlength is 2(which is 01)-->
  <field3>1123</field3>
  <!--field3 value is 1123 as it is fixed, total length of 4-->
  <field21>
    <subfield1>145</subfield1>
    <!--subfield1 should be 145 as it is fixed length of total 3 chars-->
    <subfield2>12345678</subfield2>
    <!--subfield2 starts with 'ABC', has length 08 chars-->
  </field21>
</Root>

Finally, how can we convert the XML node back to the hexadecimal string?

Paul Sweatte
  • 24,148
  • 7
  • 127
  • 265
Suresh
  • 1,081
  • 4
  • 21
  • 44
  • 1
    Suresh, I strongly suggest that you split this problem into a series of smaller and simpler problems, each of which can be separately solved -- and ask these as separate questions. In its current form the question requires extraordinary amount of work (hours) and this isn't appealing to potential solvers, including me. For example, limit the 1st question to: get a sequence of field numbers from a hexadecimal string. Please. – Dimitre Novatchev Aug 17 '12 at 12:05
  • 1
    Amen to Dimitre's comment. Also, what XSLT have you tried, and what has been the result? – LarsH Aug 17 '12 at 14:09

1 Answers1

0

Use the following templates to convert hexadecimal to decimal:

<xsl:template name="singleHexToDec">
  <xsl:param name="hex"/>
  <xsl:variable name="table" select="'0123456789ABCDEF'"/>
  <xsl:value-of select="string-length(substring-before($table,$hex))"/>
</xsl:template>

<xsl:template name="hexToDec">
    <xsl:param name="hexVal"/>
    <xsl:param name="decVal"/>
    <xsl:variable name="hexLength" select="string-length($hexVal)"/>
    <xsl:choose>
      <xsl:when test="$hexLength &gt; 0">
        <xsl:variable name="hexPos">
          <xsl:call-template name="singleHexToDec">
            <xsl:with-param name="hex" select="substring($hexVal,1,1)"/>
          </xsl:call-template>
        </xsl:variable>
        <xsl:variable name="addToDec">
          <xsl:call-template name="raiseToPower">
            <xsl:with-param name="number" select="16"/>
            <xsl:with-param name="power" select="$hexLength - 1"/>
          </xsl:call-template>
        </xsl:variable>
        <xsl:call-template name="hexToDec">
          <xsl:with-param name="hexVal" select="substring($hexVal,2)"/>
          <xsl:with-param name="decVal" 
     select="$decVal + ($addToDec * $hexPos)"/>
        </xsl:call-template>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="$decVal"/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

References

Community
  • 1
  • 1
Paul Sweatte
  • 24,148
  • 7
  • 127
  • 265