使用XSL和Php将XML数据转换为HTML:只打印XML标记而不打印任何格式
我必须将xml输出转换为html。我正在学习一个教程,我的代码在一行中输出xml标记,没有任何文本值格式。我希望输出为HTML无序列表,遵循xml文件输出中父-子的层次结构 以下是页面输出:使用XSL和Php将XML数据转换为HTML:只打印XML标记而不打印任何格式,php,html,xml,xslt,Php,Html,Xml,Xslt,我必须将xml输出转换为html。我正在学习一个教程,我的代码在一行中输出xml标记,没有任何文本值格式。我希望输出为HTML无序列表,遵循xml文件输出中父-子的层次结构 以下是页面输出: message msg 1message msg 1-1message msg 1-2message msg 1-2-1message msg 1-2-2message msg 1-2-2-1message msg 1-2-2-1-1message msg 1-2-2-1-2 &以下是页面来源: &l
message msg 1message msg 1-1message msg 1-2message msg 1-2-1message msg 1-2-2message
msg 1-2-2-1message msg 1-2-2-1-1message msg 1-2-2-1-2
&以下是页面来源:
<html:ul xmlns:html="http://www.w3.org/1999/xhtml"><html:li>message msg 1</html:li>
<html:ul><html:li>message msg 1-1</html:li><html:li>message msg 1-2</html:li><html:ul>
<html:li>message msg 1-2-1</html:li><html:li>message msg 1-2-2</html:li><html:ul>
<html:li>message msg 1-2-2-1</html:li><html:ul><html:li>message msg 1-2-2-1-1</html:li>
<html:li>message msg 1-2-2-1-2</html:li></html:ul></html:ul></html:ul></html:ul></html:ul>
消息消息消息1
消息消息1-1消息消息消息1-2
消息消息1-2-1消息消息消息1-2-2
消息消息1-2-2-1消息消息消息1-2-2-1-1
信息msg 1-2-2-1-2
这是我的密码
php file:
<?php
# LOAD XML FILE
$XML = new DOMDocument();
$XML->load('messages.xml');
# START XSLT
$xslt = new XSLTProcessor();
$XSL = new DOMDocument();
$XSL->load('msg.xsl');
$xslt->importStylesheet( $XSL );
print $xslt->transformToXML( $XML );
?>
php文件:
加载('messages.xml');
#启动XSLT
$xslt=新的XSLTProcessor();
$XSL=newdomdocument();
$XSL->load('msg.XSL');
$xslt->importStylesheet($XSL);
打印$xslt->transformToXML($XML);
?>
msg.xsl:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:html="http://www.w3.org/1999/xhtml">
<xsl:output omit-xml-declaration="yes" />
<xsl:template match="messages">
<html:ul>
<xsl:apply-templates select="message" />
</html:ul>
</xsl:template>
<xsl:template match="message[message]">
<html:li>message <xsl:value-of select="@msg_id" /></html:li>
<html:ul>
<xsl:apply-templates select="message" />
</html:ul>
</xsl:template>
<xsl:template match="message">
<html:li>message <xsl:value-of select="@msg_id" /></html:li>
<xsl:apply-templates select="message" />
</xsl:template>
</xsl:stylesheet>
消息
消息
messages.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="msg.xsl"?><messages>
<message msg_id="1" emp_msg="msg 1" parent_msg_id="" parent_msg="" depth="0">
<message msg_id="2" emp_msg="msg 1-1" parent_msg_id="1" parent_msg="msg 1" depth="1"/>
<message msg_id="3" emp_msg="msg 1-2" parent_msg_id="1" parent_msg="msg 1" depth="1">
<message msg_id="4" emp_msg="msg 1-2-1" parent_msg_id="3" parent_msg="msg 1-2" depth="2"/>
<message msg_id="5" emp_msg="msg 1-2-2" parent_msg_id="3" parent_msg="msg 1-2" depth="2">
<message msg_id="6" emp_msg="msg 1-2-2-1" parent_msg_id="5" parent_msg="msg 1-2-2" depth="3">
<message msg_id="7" emp_msg="msg 1-2-2-1-1" parent_msg_id="6" parent_msg="msg 1-2-2-1" depth="4"/>
<message msg_id="8" emp_msg="msg 1-2-2-1-2" parent_msg_id="6" parent_msg="msg 1-2-2-1" depth="4"/>
</message>
</message>
</message>
</message>
</messages>
您的样式表不会输出HTML,而是一个XHTML片段,您需要将其作为应用程序/xml提供给理解该内容类型的浏览器(如Mozilla、Opera、Safari、IE 9,但不是IE 6-8) 所以一定要做一些类似的事情
header('Content-Type: application/xml');
将内容发送到浏览器之前。或者从结果元素中删除任何XHTML名称空间和任何前缀,然后XSLT样式表输出一个HTML片段。更多浏览器可以将其解析为text/HTML,并根据需要进行呈现。要成为交叉浏览器,我将使用此样式表:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes"
doctype-public="-//W3C//DTD HTML 4.0//EN"
doctype-system="http://www.w3.org/TR/html4/strict.dtd"/>
<xsl:template match="messages">
<html>
<body>
<xsl:apply-templates select="*[1]"/>
</body>
</html>
</xsl:template>
<xsl:template match="message[1]">
<ul>
<xsl:call-template name="makeListItem"/>
</ul>
</xsl:template>
<xsl:template match="message" name="makeListItem">
<li>
<xsl:value-of select="concat('message ',@msg_id)" />
<xsl:apply-templates select="*[1]"/>
</li>
<xsl:apply-templates select="following-sibling::*[1]"/>
</xsl:template>
</xsl:stylesheet>
输出:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<body>
<ul>
<li>message 1
<ul>
<li>message 2</li>
<li>message 3
<ul>
<li>message 4</li>
<li>message 5
<ul>
<li>message 6
<ul>
<li>message 7</li>
<li>message 8</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</body>
</html>
- 信息1
- 信息2
- 信息3
- 信息4
- 信息5
- 信息6
- 信息7
- 信息8
渲染为:
- 信息1
- 信息2
- 信息3
- 信息4
- 信息5
- 信息6
- 信息7
- 信息8
- 信息6
注意:HTML DOCTYPE,无命名空间。还有另一种通过细粒度遍历进行层次结构处理的方法。XML文件是否因为剪切和粘贴错误而无效,或者您正试图转换它最后一行“你的输出是什么样子的,你希望它看起来怎么样?@Chris Bentley,这只是剪切粘贴错误。我修复了这个错误,这是因为使用“loadXML”而不是“load”来加载xml文档。虽然它不显示结果,但只是输出标签。我更新了我的问题,这不是我得到的结果。你看过页面源代码了吗?@Ignacio Vazquez Abrams,它显示了所有添加了数字的xml标记。数字可能来自xml输出,作为其一部分。我在OP中添加了输出。实际上,我希望输出是一个HTML无序列表,遵循xml文件输出中父-子层次结构它应该包含'msg_id'和'emp_msg'的值。header是一个PHP函数,因此假设您使用PHP,则需要在将任何内容发送到浏览器之前在PHP代码中进行sbown函数调用,因此,请确保将其放在print语句之前。@exceptible:您可以通过删除
xmlns:html
属性并删除每个元素前面的html:
来删除html
命名空间。请确保不要使用xsl
名称空间,因为它是使XSLT工作所必需的。您是:),而不是1000times@IgnacioVazquez Abrams,thanX数千次ignacio,您的xsl工作得非常好:)但仍有一些工作要做。由于我通过在本地保存xml来使用它,但在应用程序中,它是由php代码动态生成的,所以我应该如何在那个里实现它。我是否应该将“loadXML”部分替换为以xml生成结果集的代码,以xml获取输出并使用它?或者我应该提出一个新的问题吗?@Alejandro,我用过这个,但它打印简单的xml,没有任何formating@XCeptable:非常奇怪!我已经用您的确切PHP代码、您的确切输入示例和我的样式表进行了测试。@Exceptable:这是因为您没有像所讨论的那样使用您的确切PHP代码:您已经按照@Martin Honnen的建议添加了内容类型头,或者您已经在.htaccess文件中添加了此内容类型,或者任何后期处理程序。这条消息来自浏览器,它的意思很简单:“这是一个没有CSS或XSLT样式表的XML文档,所以我(浏览器)将使用我自己的样式表”@Alejandro,你说得对,我没有话要感谢,因为它突然使一切都像你的一样工作,不使用任何类型的标题。万分感谢again@Alejandro,如果我想打印一个标签,说msg_id只在根目录下,而不是在子目录下,那么怎么做?