将XML转换为HTML(与xhtml相反)
我想将一些xml转换为具有以下格式的HTML: col1col2col3 注意:输出为将XML转换为HTML(与xhtml相反),html,xml,xslt,html4,Html,Xml,Xslt,Html4,我想将一些xml转换为具有以下格式的HTML: col1col2col3 注意:输出为HTML,省略了可选的结束标记。这就是问题所在,也是问题存在的原因 我正在使用的XSL的一个片段是: <?xml version='1.0'?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output doctype-system='ht
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>
在关闭TR
之前,我不会关闭TD
元素。因此,问题是:
如果HTML
不是xml
,如何将xml
转换为HTML
另见
更新一 它有一个优点,就是可以简单地包含结束标记,以使XSL有效(显示为包装以便于阅读):
更新二 有人建议我放弃,不要费心问这个问题,只包括可选的结束标记。这是可能的,但这不是我的问题。此外,“解决方案”不适用于关闭标记被禁止的元素,例如:
<BR/>
或
如果在HTML中禁止关闭
元素,那么如何在HTML输出中包含
元素。伊恩,你尝试过
您是否尝试过以“HTML”的形式输出?在HTML中不应自动关闭的元素不是(即
,
)
如果您仍然不喜欢XSLT引擎序列化HTML输出的方式,那么您可以设置
并构建所需的“HTML”:
<TR><TD><xsl:value-of select="col1"/><TD><xsl:value-of select="col2"/><TD><xsl:value-of select="col3"/></TR>
TR>TD>TD>TD>/TR>
产生:
<TR><TD>col1<TD>col2<TD>col3</TR>
col1col2col3
我认为最简单的方法就是接受输出中将包含结束标记。虽然它们可能是可选的,但我相信大多数人都会同意,最好的做法是将它们包括在内
您真的不想在输出中使用可选的结束标记吗
重新更新两个
此更新没有问题。使用method=“html”
将作为
输出:
<!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>
XSLT(注意
):
输入:
<root>
<item>one</item>
<item>two</item>
</root>
一
二
输出(注意
):
一
二
这里有一种方法可以做到这一点:
<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>
<t>
<col1>1</col1>
<col2>2</col2>
<col3>3</col3>
</t>
TR>TD>TD>TD>/TR>
当此转换应用于以下XML文档时:
<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>
<t>
<col1>1</col1>
<col2>2</col2>
<col3>3</col3>
</t>
1.
2.
3.
正确生成所需结果:
<TR><TD>1<TD>2<TD>3</TR>
123
为什么您不能简单地关闭服务器?“这很有道理。”罗布斯托说,因为这不是我的问题。没错,
是有效的html。但是这个问题也可以应用于
,其中
是无效的html。或者我可以说这是我想要的格式,XSLT需要能够生成它。阅读我包含的第一个链接(HTML:Include或exclude,可选结束标记?@Ian:如果输出方法是HTML
,它将不会生成
。问得好(+1)。请看我的答案以获得完整的解决方案。@Porges,但它确实生成了
哦,天哪。这比不生成我想要的HTML
要糟糕得多,XSL
必须是没有人想要的东西!我现在明白问题所在了。我把XSLT看作是一个转换引擎,它可以将源XML转换成我想要的任何内容,像邮件合并一样进行填充。事实并非如此:您提供的xslt必须是有效的xml(因为xslt是xml)。我不能随意添加HTML标记——解析器不知道HTML
元素和xml
元素之间的区别。XSLT不如邮件合并灵活,我不能这样对待它。最后,我需要将我的需求转变为转换引擎的限制。虽然我不喜欢这个答案,但它是正确的答案。您的答案不能改变XSLT的局限性;只帮助提供最好的解决办法。已接受。@Ian Boyd:没有“XSLT的限制”--您可以精确地生成所需的输出--例如,请参见我的答案。邮件/合并解决方案也是可能的——即使表单不是格式良好的XML——也可以将其作为文本处理。XSLT 2.0和XPath 2.0提供了强大的正则表达式功能,这更容易实现;只要输出类型是html
。这就是我所拥有的。但这会打折其他需要输出文本的答案。(这就是为什么我把它作为一个答案,作为一个竞争目标)是的,如果没有提供有效的XML,源解析器会抱怨——这似乎是一个基本的约束。源XSL(本身就是xml)必须是有效的xml。一旦开始添加<和>符号,它就会假定它们是元素名称的开始。
<!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>
<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>
<t>
<col1>1</col1>
<col2>2</col2>
<col3>3</col3>
</t>
<TR><TD>1<TD>2<TD>3</TR>