Ian*_*oyd 5 html xml xslt html4
我想将一些xml转换为具有以下格式的HTML:
<TR> <TD> col1 <TD> col2 <TD> 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>
Run Code Online (Sandbox Code Playgroud)
您可以看到XSL的内容与我想要的HTML匹配(为便于阅读而包装):
<TR> <TD><xsl:value-of select="Column1"/>
<TD><xsl:value-of select="Column2"/>
<TD><xsl:value-of select="Column3"/> </TR>
Run Code Online (Sandbox Code Playgroud)
注意:那些知道我从XSLT得到的错误的人:希望已经知道答案.
当我提出我的XSL(其中,不要忘记,是一种形式xml)时,我得到了一个非常好的错误:
结束标记"TR"与起始标记"TD"不匹配.
这很有道理.确实:
<TD><xsl:value-of select="Column3"/> </TR>
Run Code Online (Sandbox Code Playgroud)
关闭TD之前我不会关闭元素TR.所以问题是:
如果不是,我怎么能xml变成?HTMLHTMLxml
它被认为是一个可以简单地包括结束标记无论如何,为了使XSL的validate(显示包裹,方便阅读):
<TR> <TD><xsl:value-of select="col1"/></TD>
<TD><xsl:value-of select="col2"/></TD>
<TD><xsl:value-of select="col3"/></TD> </TR>
Run Code Online (Sandbox Code Playgroud)
然后,通过使用xsl:output method='html',最终的HTML内容将</TD>神奇地省略标签.除非它不起作用:
<TR><TD>col1</TD><TD>col2</TD><TD>col3</TD></TR>
Run Code Online (Sandbox Code Playgroud)
有人建议我放弃,不要再问这个问题,只包括可选的结束标签.这是可能的,但这不是我的问题.此外," 解决方案 "不适用于禁止结束标记的元素,例如:
<BR/>
Run Code Online (Sandbox Code Playgroud)
要么
<BR></BR>
Run Code Online (Sandbox Code Playgroud)
如果<BR>在HTML中禁止关闭元素,我将如何在HTML输出中包含一个<BR>元素.
这是执行此操作的一种方法:
<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>
Run Code Online (Sandbox Code Playgroud)
当此转换应用于以下 XML 文档时:
<t>
<col1>1</col1>
<col2>2</col2>
<col3>3</col3>
</t>
Run Code Online (Sandbox Code Playgroud)
正确产生了想要的结果:
<TR><TD>1<TD>2<TD>3</TR>
Run Code Online (Sandbox Code Playgroud)