Преобразование XML в HTML (в отличие от XHTML)
Вопрос
Я хочу преобразовать некоторые XML в HTML, который имеет следующий формат:
u003CTR>u003CTD> Col1. u003CTD> Col2. u003CTD> Col3. u003C/TR>
Примечание: Вывод HTML
, в комплекте с дополнительными закрывающими тегами опущены. Это то Проблема, и причина существует вопрос.
Фрагмент XSL я использую:
<?xml version='1.0'?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output
doctype-system='http://www.w3.org/TR/html4/strict.dtd'
doctype-public='-//W3C//DTD HTML 4.01//EN'
indent='yes'
method='html'
/>
...
<xsl:for-each select="/">
<TR><TD><xsl:value-of select="col1"/><TD><xsl:value-of select="col2"/><TD><xsl:value-of select="col3"/></TR>
</xsl:for-each>
Вы можете увидеть, что смелость XSL соответствует моему желаемому HTML (обернуто для удобного чтения):
<TR> <TD><xsl:value-of select="Column1"/>
<TD><xsl:value-of select="Column2"/>
<TD><xsl:value-of select="Column3"/> </TR>
Примечание: Те из вас, кто знает ошибку, я получаю от XSLT: надеюсь, уже знал ответ.
Когда представлены с моим XSL
(который, не забывайте, это форма xml
), я получаю неконформу сформированную ошибку:
Конечный тег 'TR' не соответствует стартовым тегам 'TD'.
Это имеет смысл. Конечно:
<TD><xsl:value-of select="Column3"/> </TR>
Я не закрываю TD
элемент перед закрытием TR
. Отказ Итак, вопрос:
Как я могу преобразовать xml
в HTML
, учитывая, что HTML
не является xml
?
Смотрите также
- HTML: включить или исключить, необязательное закрытие тегов?
- XSLT: преобразование в содержание без XML?
- Опуская дополнительные теги HTML
Обновить один
Она имеет было предложено что можно просто включать Закрывающие метки в любом случае, чтобы сделать проверку XSL (отображается для удобного чтения):
<TR> <TD><xsl:value-of select="col1"/></TD>
<TD><xsl:value-of select="col2"/></TD>
<TD><xsl:value-of select="col3"/></TD> </TR>
Затем, используя xsl:output method='html'
, последний контент HTML будет иметь </TD>
Теги волшебным образом опущены. Кроме этого не работает:
<TR><TD>col1</TD><TD>col2</TD><TD>col3</TD></TR>
Обновить два
Было предложено, чтобы я сдался, не беспокои о том, чтобы задавать этот вопрос и просто включить необязательные закрывающие теги. Это возможно, но это не мой вопрос. Так же "решение«Не работает для элементов, где закрывающий тег запрещенный, например:
<BR/>
или
<BR></BR>
Как бы я включил <BR>
элемент в моем выходе HTML, учитывая, что это запрещенный в HTML, чтобы закрыть <BR>
элемент.
Решение
Вот один из способов сделать это:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="/*">
<TR><TD><xsl:value-of select="col1"/><TD><xsl:value-of select="col2"/><TD><xsl:value-of select="col3"/></TR>
</xsl:template>
</xsl:stylesheet>
Когда это преобразование применяется на следующем XML-документе:
<t>
<col1>1</col1>
<col2>2</col2>
<col3>3</col3>
</t>
Требуемый результат правильно произведен:
<TR><TD>1<TD>2<TD>3</TR>
Другие советы
Я считаю, что самое простое - просто принять, что вы собираетесь получить закрытие тегов на выходе. Хотя они могут быть необязательными, я считаю, что большинство людей согласится, что лучшая практика должна включать их.
Есть ли причина, по которой вы действительно не хотите дополнительные закрывающие теги на выходе?
Обновить два
Там нет проблем с этим обновлением. С участием method="html"
<BR/>
будет выводиться как <BR>
:
XSLT (Примечание <BR/>
):
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output
doctype-system='http://www.w3.org/TR/html4/strict.dtd'
doctype-public='-//W3C//DTD HTML 4.01//EN'
indent='yes'
method='html'
/>
<xsl:template match="/">
<HTML><BODY>
<TR>
<xsl:apply-templates/>
</TR>
<BR/> <!-- HERE -->
</BODY></HTML>
</xsl:template>
<xsl:template match="item">
<TD><xsl:value-of select="."/></TD>
</xsl:template>
</xsl:stylesheet>
Вход:
<root>
<item>one</item>
<item>two</item>
</root>
Вывод (Примечание <BR>
):
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<HTML><BODY>
<TR>
<TD>one</TD>
<TD>two</TD>
</TR>
<BR> <!-- HERE -->
</BODY></HTML>
Вы пробовали вывод как «HTML»? Элементы, которые не должны быть самозакрытыми в HTML, не являются (то есть <BR>
, <img>
).
если ты еще Не нравится, как двигатель XSLT сериализация HTML-вывода, то вы мог Установите свой <xsl:output method="text">
и построить «HTML», который вы хотите:
<TR><TD><xsl:value-of select="col1"/><TD><xsl:value-of select="col2"/><TD><xsl:value-of select="col3"/></TR>
который производит:
<TR><TD>col1<TD>col2<TD>col3</TR>
Ян, ты пробовал <xsl:output method="text">
?