我想将一些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>
元素。
答案 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="/*">
<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>
答案 2 :(得分:1)
您是否尝试过“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>
答案 3 :(得分:0)
伊恩,你试过<xsl:output method="text">
吗?