我正在编写代码生成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; }
任何能让我朝着正确方向前进的指示都将非常感激。
麦克
答案 0 :(得分:0)
我建议尝试使用xsl:param和/或xsl:variable以及嵌套模板。
顶部模板与第一个foo匹配,并为下一个兄弟调用嵌套模板,将累积的位偏移作为xsl:param传递给它。
嵌套模板为下一个兄弟调用自己。
当找不到foo时,嵌套结束。
我认为它应该有用。