【问题标题】:Transforming XML into HTML (as opposed to xhtml)将 XML 转换为 HTML(相对于 xhtml)
【发布时间】: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

另见


更新一个

它有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 内容将神奇地省略&lt;/TD&gt; 标签。除非它不起作用:

<TR><TD>col1</TD><TD>col2</TD><TD>col3</TD></TR>

更新二

有人建议我放弃,不要费心问这个问题,只包括可选的结束标签。这是可能的,但这不是我的问题。此外,“solution”不适用于结束标记为 forbidden 的元素,例如:

<BR/>

<BR></BR>

如果在 HTML 中禁止关闭&lt;BR&gt; 元素,我将如何在我的 HTML 输出中包含 &lt;BR&gt; 元素。

【问题讨论】:

  • 为什么不能直接关闭?这是最有意义的。
  • @Robusto 因为那不是我的问题。你是对的,&lt;/TD&gt; 是有效的 html。但这个问题也可以适用于&lt;BR&gt;,其中&lt;/BR&gt;invalid html。或者我可以说这是我想要的格式,XSLT 需要能够生成它。阅读我包含的第一个链接(HTML:包含或排除可选的结束标签?)
  • @Ian:如果输出方式为html,则不会生成&lt;/BR&gt;
  • 好问题 (+1)。请参阅我的答案以获得完整的解决方案。
  • @Porges 但它确实会生成&lt;/TD&gt;

标签: html xml xslt html4


【解决方案1】:

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

你真的不想在输出中出现可选的结束标签吗?

重新更新二

此更新没有问题。使用method="html" &lt;BR/&gt; 将输出为&lt;BR&gt;

XSLT(注&lt;BR/&gt;):

<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>

输出(注&lt;BR&gt;):

<!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>

【讨论】:

  • 你是对的;只要输出类型是html。这就是我所拥有的。但这会打折其他需要输出text 的答案。 (这就是为什么我把它作为一个答案,作为一个竞争目标)
【解决方案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>

【讨论】:

    【解决方案3】:

    你试过输出为“HTML”吗?不应在 HTML 中自闭合的元素不是(即&lt;BR&gt;&lt;img&gt;)。

    如果您仍然不喜欢 XSLT 引擎序列化 HTML 输出的方式,那么您可以设置您的&lt;xsl:output method="text"&gt; 并构建您想要的“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>  
    

    【讨论】:

    • 天哪。这比它不生成我想要的HTML 要糟糕得多...XSL 必须是 没有人 想要的东西!
    • 我现在看到了问题。我将 XSLT 视为一种转换引擎,它可以获取源 XML 并将其转换为我想要的任何内容,像邮件合并一样填充位。情况并非如此:您给它的 xslt 必须是有效的 xml (因为 xslt is xml)。我不能随便添加 HTML 标记 - 解析器不知道 html 元素和 xml 元素之间的区别。 XSLT 不像邮件合并那样灵活,我不能这样对待它。最后,我需要将我的要求屈从于转换引擎的限制。
    • 尽管我不喜欢这个答案,但它是正确的答案。您的回答不能改变 XSLT 的限制;仅有助于提供最佳解决方法。接受。
    • @Ian-Boyd:没有“XSLT 的限制”——您可以准确地产生您想要的输出——例如我的回答。邮件/合并解决方案也是可能的——即使表单不是格式良好的 XML——也可以将其作为文本处理。使用 XSLT 2.0 和 XPath 2.0 以及它们提供的强大的 RegEx 功能,这更加容易。
    【解决方案4】:

    伊恩,你试过&lt;xsl:output method="text"&gt;吗?

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

    【讨论】:

    • 是的,如果没有给出有效的 XML,源解析器会抱怨 - 这似乎是一个基本约束。源 XSL(其本身 xml)必须是有效的 XML。一旦你开始添加 符号,它就会假定它们是元素名称的开头。
    猜你喜欢
    • 2016-12-30
    • 2014-03-30
    • 1970-01-01
    • 2019-03-22
    • 1970-01-01
    • 2010-09-13
    • 2012-08-19
    相关资源
    最近更新 更多