Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将XML转换为HTML(与xhtml相反)_Html_Xml_Xslt_Html4 - Fatal编程技术网

将XML转换为HTML(与xhtml相反)

将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

我想将一些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='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”:

&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>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="/*">
   &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>
<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="/*">
   &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>
<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="/*">
   &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>
<t>
 <col1>1</col1>
 <col2>2</col2>
 <col3>3</col3>
</t>
   <TR><TD>1<TD>2<TD>3</TR>