【发布时间】:2011-03-09 22:01:15
【问题描述】:
我想将一些 xml 转换为具有以下格式的 HTML:
col1 col2
强> col3
注意:输出为HTML,省略了可选的结束标记。这是问题,也是问题存在的原因。
我正在使用的 XSL 的 sn-p 是:
<?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>
在关闭TR 之前,我不会关闭TD 元素。所以问题是:
鉴于HTML 不是xml,我如何将xml 转换为HTML?
另见
- HTML: Include, or exclude, optional closing tags?
- XSLT: Transforming into non-xml content?
- Omitting optional tags of html
更新一个
它有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>
更新二
有人建议我放弃,不要费心问这个问题,只包括可选的结束标签。这是可能的,但这不是我的问题。此外,“solution”不适用于结束标记为 forbidden 的元素,例如:
<BR/>
或
<BR></BR>
如果在 HTML 中禁止关闭<BR> 元素,我将如何在我的 HTML 输出中包含 <BR> 元素。
【问题讨论】:
-
为什么不能直接关闭
?这是最有意义的。 -
@Robusto 因为那不是我的问题。你是对的,
</TD>是有效的 html。但这个问题也可以适用于<BR>,其中</BR>是invalid html。或者我可以说这是我想要的格式,XSLT 需要能够生成它。阅读我包含的第一个链接(HTML:包含或排除可选的结束标签?) -
@Ian:如果输出方式为
html,则不会生成</BR>。 -
好问题 (+1)。请参阅我的答案以获得完整的解决方案。
-
@Porges 但它确实会生成
</TD>