将XML转换为HTML(而不是xhtml)

时间:2010-06-30 01:02:37

标签: html xml xslt html4

我想将一些xml转换为具有以下格式的HTML:

< TR>< TD> col1 < TD> col2 <道明> col3 < / 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

另见


更新一个

它有been suggested,无论如何都可以包含结束标记,以便进行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>

我如何在HTML输出中包含<BR>元素,因为HTML中禁止关闭<BR>元素。

4 个答案:

答案 0 :(得分:2)

我认为最简单的事情就是接受你将在输出中使用结束标记。虽然它们可能是可选的,但我相信大多数人会同意最佳做法是将它们包括在内。

您是否真的不想在输出中使用可选的结束标记?

重新更新两次

此更新没有问题。 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 :(得分:2)

以下是执行此操作的一种方法

<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 :(得分:1)

您是否尝试过“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>  

答案 3 :(得分:0)

伊恩,你试过<xsl:output method="text">吗?

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