Интересная проблема генерации Java-кода с использованием XSLT - PullRequest
0 голосов
/ 05 апреля 2011

Я нахожусь в процессе написания 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; }

Будем весьма благодарны за любые указатели, которые помогут мне двигаться в правильном направлении.

Mike

1 Ответ

0 голосов
/ 05 апреля 2011

Я бы посоветовал попробовать xsl: param и / или xsl: variable и вложенный шаблон.

Лучшие шаблоны соответствуют первому foo и вызывают вложенный шаблон для next-sibling, передавая ему накопленное битовое смещениекак xsl: param.

Вложенный шаблон вызывает себя для следующего брата.

Вложенность заканчивается, когда больше не найдено foo.

Я думаю, что это должно работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...