使用php在客户端使用xsl

时间:2015-10-15 20:19:33

标签: php xml xslt

我正在使用PHP查询聊天室中的人员列表,然后附加到XML,以便客户端的AJAX脚本可以抓取它。我不想对服务器施加太多压力,按名称按字母顺序排序。因此;我正在考虑在客户端使用xslt来订购它。但是我不确定如何将它附加到XML页面,当我这样做时,我不断收到错误。 :/ 所以有人可以告诉我如何正确地做到这一点。

PHP:

header('Content-type: application/xml; charset=utf-8');
mysqli_set_charset($mysqli_connect, "UTF8");

$xml = new DomDocument("1.0", "UTF-8");
$root = $xml->createElement('root');
$xml->appendChild($root);
    $message = $xml->createElement('message');
    $root->appendChild($message);  

//while loop and appending the result from query

echo $xml->saveXML();

结果:

  <root>
        <message>
            <name>foo</name>
            <gender>1</gender>
            <chat_message>hello world</chat_message>
        </message>
        <message>
            <name>boo</name>
            <gender>1</gender>
            <chat_message>Hello</chat_message>
        </message>
    </root>

我需要XML按名称按字母顺序对其进行排序:

<root>
    <message>
        <name>boo</name>
        <gender>1</gender>
        <chat_message>Hello</chat_message>
    </message>
    <message>
        <name>foo</name>
        <gender>1</gender>
        <chat_message>hello world</chat_message>
    </message>
</root>

更新: 试图在php页面上附加xslt,但我一直在发错: XML解析错误:格式不正确。

$xslt = $xml->createProcessingInstruction('xml-stylesheet', 'type="text/xsl" href="style.xsl"');
$xml->appendChild($xslt);

2 个答案:

答案 0 :(得分:0)

这是一种更简单的方法..

// convert xml to native array
$array = json_decode(json_encode(simplexml_load_string($xmlstring)),TRUE);

// add stuff to it..
$array['something'] = 'something';

// do whatever sorting..
asort($array);

// convert back to xml..
$xml = new SimpleXMLElement('<root/>');
array_walk_recursive($array, array ($xml, 'addChild'));
print $xml->asXML();

答案 1 :(得分:0)

考虑使用PHP的XSLT processor class(可能需要启用xsl扩展名),您可以在message/name值上使用<xsl:sort>应用嵌入式XSLT。

...
$xslstr = '<?xml version="1.0" ?> 
           <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">  
            <xsl:output method="xml" indent="yes"/>

             <xsl:template match="root">
                <root>        
                   <xsl:for-each select="message">
                      <xsl:sort select="name"/>
                      <message>           
                          <xsl:copy-of select="*"/>
                      </message>
                   </xsl:for-each>
                </root>
             </xsl:template>
            </xsl:stylesheet>';

$xsl = new DOMDocument;
$xsl->loadXML($xslstr);

// Configure transformer
$proc = new XSLTProcessor;
$proc->importStyleSheet($xsl);

// Transform XML source
$newXML = new DOMDocument;
$newXML = $proc->transformToXML($xml);

// Output New XML content
echo $newXML;

输出

<?xml version="1.0"?>
<root>
  <message>
    <name>boo</name>
    <gender>1</gender>
    <chat_message>Hello</chat_message>
  </message>
  <message>
    <name>foo</name>
    <gender>1</gender>
    <chat_message>hello world</chat_message>
  </message>
</root>