У меня есть таблица стилей, которая генерирует HTML для файлов XML.
Пример XML-файла:
<?xml version="1.0" encoding="utf-8" ?>
<?xml-stylesheet type="text/xsl" href="trial.xsl"?>
<wholeEnchilada>
<Interface>
<Messages>
<Message name="blah">
<Variable name="DialogIdentifier" dataType="UINT16"/>
<Variable name="ReplyCount" dataType="UINT16"/>
<Variable name="ReplyPeriod" dataType="UINT16"/>
</Message>
<Message>
<Variable name="Uptime" dataType="UINT32"/>
<Variable name="FaultIndicator" dataType="UINT32"/>
<Variable name="OperatingMode" dataType="UINT8"/>
</Message>
</Messages>
</Interface>
<Interface>
<Messages>
<Message>
<Variable name="vara" dataType="UINT64"/>
<Variable name="varb" dataType="UINT8"/>
</Message>
</Messages>
</Interface>
</wholeEnchilada>
Пример таблицы стилей:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<HTML>
<BODY>
<xsl:for-each select="*">
<xsl:for-each select="Interface">
<xsl:for-each select="Messages">
<xsl:for-each select="Message">
<TABLE BORDER="1">
<TR><TH>Field Name</TH><TH>Size</TH><TH>Offset</TH></TR>
<!-- Fields-->
<xsl:for-each select="Variable">
<TR>
<TD><xsl:value-of select="@name"/></TD>
<TD><xsl:value-of select="@size"/></TD>
<TD><xsl:value-of select="@offset"/></TD>
</TR>
</xsl:for-each> <!-- Fields-->
</TABLE>
<xsl:for-each select="Variable">
<xsl:variable name="fieldSize" select="substring-after(@dataType,'INT') div 8"/>
<TABLE BORDER="1">
<TR><TH>Name</TH> <TH><xsl:value-of select="@name"/></TH></TR>
<TR><TD>Size</TD> <TD><xsl:value-of select="$fieldSize"/></TD></TR>
<TR><TD>Offset</TD> <TD><xsl:value-of select="Offset"/></TD></TR>
<TR><TD>DataType</TD><TD><xsl:value-of select="@dataType"/></TD></TR>
</TABLE>
</xsl:for-each>
<hr size="10" noshade="true"/>
</xsl:for-each> <!-- Message -->
</xsl:for-each> <!-- Messages -->
</xsl:for-each> <!-- Interface -->
</xsl:for-each> <!-- * -->
</BODY>
</HTML>
</xsl:template>
</xsl:stylesheet>
Моя таблица стилей ~300 строк в длину, и печатает намного больше атрибутов, а навигация намного больше структуры, чем в приведенном выше примере.
Я задал вопрос о том, как рассчитать размеры полей (INT8-> 1, INT16-> 2, INT32-> 4), а также смещения переменных, где первая переменная начинается с 0, следующая начинается после первой и т. Д. Я думаю, что на вопрос был дан ответ, но, к сожалению, мне не удалось интегрировать ответчтобы генерировать HTML в моей существующей таблице стилей.
Моя попытка интегрировать ответ Алехандро из его "Правки 3", но, основываясь на выводе, я не сделал это правильно:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="Variable">
<xsl:param name="fieldOffset" select="0"/>
<xsl:variable name="fieldSize" select="substring-after(@dataType,'INT') div 8"/>
(<xsl:value-of select="@name"/>, <xsl:value-of select="$fieldSize"/>, <xsl:value-of select="$fieldOffset"/>)
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:attribute name="size">
<xsl:value-of select="$fieldSize"/>
</xsl:attribute>
<xsl:attribute name="offset">
<xsl:value-of select="$fieldOffset"/>
</xsl:attribute>
</xsl:copy>
((<xsl:value-of select="@name"/>, <xsl:value-of select="@size"/>, <xsl:value-of select="@offset"/>))
<xsl:apply-templates select="following-sibling::Variable[1]">
<xsl:with-param name="fieldOffset" select="$fieldOffset + $fieldSize"/>
<xsl:value-of select="@fieldOffset"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="/">
<HTML>
<BODY>
<xsl:for-each select="*">
<xsl:for-each select="Interface">
<xsl:for-each select="Messages">
<xsl:for-each select="Message">
<TABLE BORDER="1">
<TR><TH>Field Name</TH><TH>Size</TH><TH>Offset</TH></TR>
<!-- Fields-->
<xsl:for-each select="Variable">
<xsl:apply-templates select="*[1]|following-sibling::*[1]"/>
<TR>
<TD><xsl:value-of select="@name"/></TD>
<TD><xsl:value-of select="@size"/></TD>
<TD><xsl:value-of select="@offset"/></TD>
</TR>
</xsl:for-each> <!-- Fields-->
</TABLE>
<xsl:for-each select="Variable">
<xsl:variable name="fieldSize" select="substring-after(@dataType,'INT') div 8"/>
<TABLE BORDER="1">
<TR><TH>Name</TH> <TH><xsl:value-of select="@name"/></TH></TR>
<TR><TD>Size</TD> <TD><xsl:value-of select="$fieldSize"/></TD></TR>
<TR><TD>Offset</TD> <TD><xsl:value-of select="Offset"/></TD></TR>
<TR><TD>DataType</TD><TD><xsl:value-of select="@dataType"/></TD></TR>
</TABLE>
</xsl:for-each>
<hr size="10" noshade="true"/>
</xsl:for-each> <!-- Message -->
</xsl:for-each> <!-- Messages -->
</xsl:for-each> <!-- Interface -->
</xsl:for-each> <!-- * -->
</BODY>
</HTML>
</xsl:template>
</xsl:stylesheet>
Основываясь на моих диагностических утверждениях (которые отображаются в скобках в выводе HTML), шаблоны выполняются , я просто не знаю, как сделать правильный вывод из шаблонаВ HTML появляются данные.xsl: copy, кажется, создает копии узлов и помещает в них новые атрибуты @size и @offset, но не таким образом, чтобы эти атрибуты были доступны для моих операторов <xsl:value-of select="@size"/>
и <xsl:value-of select="@offset"/>
.
Вот HTML-код, который я хотел бы получить для первого сообщения в файле XML:
<table border="1">
<tbody>
<tr><th>Field Name</th><th>Size</th><th>Offset</th></tr>
</tbody>
<tbody>
<tr><td>DialogIdentifier</td><td>2</td><td>0</td></tr>
<tr><td>ReplyCount</td><td>2</td><td>2</td></tr>
<tr><td>ReplyPeriod</td><td>2</td><td>4</td>
</tr></tbody>
</table>
<table border="1">
<tbody>
<tr><th>Name</th><th>DialogIdentifier</th></tr>
<tr><td>Size</td><td>2</td></tr>
<tr><td>Offset</td><td>0</td></tr>
<tr><td>DataType</td><td>UINT16</td></tr>
</tbody>
</table>
<table border="1">
<tbody>
<tr><th>Name</th><th>ReplyCount</th></tr>
<tr><td>Size</td><td>2</td></tr>
<tr><td>Offset</td><td>2</td></tr>
<tr><td>DataType</td><td>UINT16</td></tr>
</tbody>
</table>
<table border="1">
<tbody>
<tr><th>Name</th><th>ReplyPeriod</th></tr>
<tr><td>Size</td><td>2</td></tr>
<tr><td>Offset</td><td>4</td></tr>
<tr><td>DataType</td><td>UINT16</td></tr>
</tbody>
</table>