使用XSLT的有趣的Java代码生成问题

时间:2011-04-04 23:14:52

标签: java xml xslt code-generation

我正在编写代码生成XSL的过程中遇到一个棘手的问题,我需要一些专家帮助。

XML定义了一个消息传递对象及其成员。下面是一个消息对象的小样本,需要将其转换为适合序列化的Java对象:

<message name="MyObject">
  <comment>Some comment</comment>
  <field name="a" type="byte"/>
  <field name="b" type="Int32"/>
  <field name="c" type="string"/>
  <field name="foo1" type="byte" numberOfBits="3"/>
  <field name="foo2" type="bool" numberOfBits="1" />
  <field name="foo3" type="bool" numberOfBits="1" />
  <field name="foo4" type="bool" numberOfBits="1" />
  <field name="foo5" type="bool" numberOfBits="1" />
  <field name="foo6" type="bool" numberOfBits="1"/>
  <field name="d" type="Int32"/>
  <field name="e" type="Int32"/>
  <field name="f" type="Int16"/>
  <field name="bar1" type="byte" numberOfBits="4"/>
  <field name="bar2" type="empty" numberOfBits="3"/>
  <field name="bar3" type="bool" numberOfBits="1"/>
</message>

我正在努力为上面的foo和bar成员生成必要的位操作。这些“numberOfBits”成员中的每一组将始终是8位的组,并且始终适合一个字节。特别是我无法跟踪当前字节的位数以及何时开始下一个字节。

例如,如果我从头开始编写,上面的foo成员会看起来像下面这样:

 byte bitset1;


 byte    getFoo1() { return (biteset1 & 0x07); }
 boolean getFoo2() { return (biteset1 & 0x08) == 0x08; }
 boolean getFoo3() { return (biteset1 & 0x10) == 0x10; }
 boolean getFoo4() { return (biteset1 & 0x20) == 0x20; }
 boolean getFoo5() { return (biteset1 & 0x40) == 0x40; }
 boolean getFoo6() { return (biteset1 & 0x80) == 0x80; }

任何能让我朝着正确方向前进的指示都将非常感激。

麦克

1 个答案:

答案 0 :(得分:0)

我建议尝试使用xsl:param和/或xsl:variable以及嵌套模板。

顶部模板与第一个foo匹配,并为下一个兄弟调用嵌套模板,将累积的位偏移作为xsl:param传递给它。

嵌套模板为下一个兄弟调用自己。

当找不到foo时,嵌套结束。

我认为它应该有用。