Преобразование данных XML в HTML с использованием XSL и Php: только печать тегов XML без какого-либо форматирования - PullRequest
2 голосов
/ 02 декабря 2010

Мне нужно преобразовать вывод 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>

Вот мой код

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 );
?>

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>

Ответы [ 2 ]

1 голос
/ 02 декабря 2010

Ваша таблица стилей выводит не HTML, а скорее фрагмент XHTML, и таким образом (с определенными именами), что вам нужно использовать его как application / xml для браузера (например, Mozilla, Opera, Safari, IE 9, но не IE 6-8), который понимает этот тип контента.

Поэтому убедитесь, что вы делаете что-то вроде

  header('Content-Type: application/xml');

перед отправкой контента в браузер. Или удалите любое пространство имен XHTML и любые префиксы из элементов результата, а затем таблица стилей XSLT выводит фрагмент HTML, который многие другие браузеры могут анализировать и понимать как text / html, и отображать его по своему усмотрению.

0 голосов
/ 02 декабря 2010

Чтобы быть кросс-браузером, я бы использовал эту таблицу стилей:

<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

Примечание : HTML DOCTYPE, без пространства имен.Также другой подход к иерархической обработке с мелкозернистым обходом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...