5

我想将一些 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>

您可以看到 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变成?HTMLHTMLxml

也可以看看


更新一

有人建议无论如何都可以简单地包含结束标签,以使 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>

<BR>鉴于 HTML 中禁止关闭元素,我将如何在我的 HTML 输出中包含一个<BR>元素。

4

4 回答 4

2

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

您是否真的不希望在输出中出现可选的结束标签?

重新更新二

这次更新没有问题。Withmethod="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>
于 2010-06-30T01:41:23.527 回答
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>
于 2010-06-30T01:57:14.893 回答
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>  
于 2010-06-30T01:41:08.953 回答
0

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

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

于 2010-06-30T01:30:31.193 回答