Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/282.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
使用XSL和Php将XML数据转换为HTML:只打印XML标记而不打印任何格式_Php_Html_Xml_Xslt - Fatal编程技术网

使用XSL和Php将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

我必须将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 
&以下是页面来源:

<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

    注意: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只在根目录下,而不是在子目录下,那么怎么做?