У меня есть какой-то XML вида:
<definitions devices="myDevice">
<reg offset="0x0000" mnem="someRegister">
<field mnem="someField" msb="31" lsb="24 />
...
</reg>
...
</definitions>
Я хочу, чтобы XML был полной ссылкой, и использую XSLT для преобразования его в HTML для документации, .h для сборки (и, возможно, других форм).
HTML-версия работает нормально и создает таблицу для каждого регистра со строкой для каждого поля:
... (header boilerplate removed)
<xsl:for-each select="definitions/reg">
<table>
<tr>
<th><xsl:value-of select="@offset"/></th>
<th><xsl:value-of select="@mnem"/></th>
</tr>
<xsl:for-each select="field">
<tr>
<td><xsl:value-of select="@msb"/>..<xsl:value-of select="@lsb"/></td>
<td><xsl:value-of select="@mnem"/></td>
</tr>
</xsl:for-each>
</table>
</xsl:for-each>
Преобразование в .h не очень хорошо. Я полностью не могу сгенерировать необходимые пробелы в выводе:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:for-each select="definitions/reg">
#define <xsl:value-of select="translate(@mnem,'abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLMNOPQRSTUVWXYZ')"/>
<xsl:text> </xsl:text>
<xsl:value-of select="@offset"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Я надеюсь, что для получения результата:
#define SOMEREGISTER 0x0000
Но я на самом деле получаю:
#define SOMEREGISTER0x0000
Я не понимаю, почему я получаю пробел после «#define», но не после пробужденной мнемоники. Я пробовал более простое решение с использованием только встроенного пространства с теми же результатами.
Я слишком новичок в этом (XSLT), чтобы знать, что я а) делаю это неправильно или б) нашел ограничение в tDOM .