Я работаю над генерацией кода Java, и XSLT, в котором есть множество <xsl:if>
или <xsl:choose>
, не поддерживается.
Порядок полей важен для сообщения, и я нашел единственный способ создать другое поле - использовать регистр переключения для другого атрибута.
Это пример данных XML:
<?xml version="1.0" encoding="ISO-8859-1"?>
<message class="Message" length="28" id="0x12457836"
package="org.goinfre.mail.data">
<comment>bulk message</comment>
<field name="state" type="short" size="2"/>
<field name="reserve" size="2" reserved="true"/>
<field name="reserve" size="1" reserved="true"/>
<field name="identification" type="char">
<array size="32" sizeName="IDENT_SIZE" encoding="UTF8" />
</field>
<field name="validity" type="int" size="4"/>
<field name="voie" type="long" size="8"/>
</message>
Соответствующий XSL слишком длинный, но, например, для каждого поля я использую <xsl:choose>
, потому что важен порядок буфера сообщения кодирования и декодирования. Мне нужно использовать каждое поле более одного раза.
<xsl:template match="/message">
[...]
<xsl:apply-templates select="field" mode="generateField"/><xsl:text>
[...]
@Override
public byte[] toByteArray() {
ByteBuffer buffer = ByteBuffer.allocate(LENGTH);
super.toByteArray(buffer);
</xsl:text>
<xsl:apply-templates select="field" mode="generateBuffer"/>
<xsl:text>
return buffer.array();
}
</xsl:template>
<!--
*****************************************************************
** Generate a private field declaration.
**************************************************************-->
<xsl:template match="field" mode="generateField">
<xsl:choose>
<xsl:when test="array">
private int <xsl:value-of select="array/@sizeName"/><xsl:text> = </xsl:text><xsl:value-of select="array/@size"/>;
private <xsl:value-of select="@type"/><xsl:text>[] </xsl:text><xsl:value-of select="@name"/>
<xsl:text> = new </xsl:text><xsl:value-of select="@type"/>
<xsl:text>[</xsl:text><xsl:value-of select="array/@sizeName"/><xsl:text>];</xsl:text>
</xsl:when>
<xsl:when test="not(@reserved)">
private <xsl:value-of select="@type"/><xsl:text> </xsl:text><xsl:value-of select="@name"/>;
</xsl:when>
</xsl:choose>
</xsl:template>
Я хочу использовать разные элементы (массив полей, зарезервированное поле, поле ...) для каждого поля, но порядок не соблюдается.
- Это правильный способ использования XSL?
- Есть ли у вас какие-либо советы о том, как генерировать код с помощью XSLT?
Примечание : я все еще могу изменить формат XML.