Преобразование XML в HTML (в отличие от xhtml) - PullRequest
5 голосов
/ 30 июня 2010

Я хочу преобразовать некоторые XML в HTML, который имеет следующий формат:

col1 col2 col3

Примечание: Вывод 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?

Смотри также


Обновление одного

было предложено , что можно просто включить закрывающие теги в любом случае, чтобы сделать 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>

Обновление два

Было предложено, чтобы я сдался, не стал задавать этот вопрос и просто включил дополнительные закрывающие теги. Это возможно, но это не мой вопрос. Кроме того, « решение » не работает для элементов, где закрывающий тег запрещен , например ::110000

<BR/>

или

<BR></BR>

Как бы я включил элемент <BR> в мой вывод HTML, учитывая, что запрещено в HTML для закрытия элемента <BR>.

Ответы [ 4 ]

2 голосов
/ 30 июня 2010

Вот один из способов сделать это :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:template match="/*">
   &lt;TR>&lt;TD><xsl:value-of select="col1"/>&lt;TD><xsl:value-of select="col2"/>&lt;TD><xsl:value-of select="col3"/>&lt;/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>
2 голосов
/ 30 июня 2010

Я считаю, что самое простое - просто принять, что в выводе будут закрывающие теги.Хотя они могут быть необязательными, я полагаю, что большинство людей согласятся с тем, что лучше всего их включать.

Есть ли причина, по которой вы действительно не хотите, чтобы в выводе были дополнительные закрывающие теги?

ReОбновление Два

Нет проблем с этим обновлением.С 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>
1 голос
/ 30 июня 2010

Вы пробовали выводить как "HTML"?Элементы, которые не должны быть самозакрывающимися в HTML, не являются (т.е. <BR>, <img>).

Если вам все еще не нравится то, какмеханизм XSLT сериализует вывод HTML, тогда вы могли бы установить свой <xsl:output method="text"> и создать нужный «HTML»:

&lt;TR>&lt;TD><xsl:value-of select="col1"/>&lt;TD><xsl:value-of select="col2"/>&lt;TD><xsl:value-of select="col3"/>&lt;/TR>

, который производит:

<TR><TD>col1<TD>col2<TD>col3</TR>  
0 голосов
/ 30 июня 2010

Ян, ты пробовал <xsl:output method="text">?

http://www.w3schools.com/xsl/el_output.asp

...