我正在寻找几天,但找不到解决方案。我使用 php 的 XSLTProcessor 方法输出由 xsl 文件转换的 xml 文件。
除了 xsl 文件中的排序功能外,一切都很完美。
(为了测试,我在 xml 文件中添加了 xsl 文件路径并直接在 Firefox 中打开它:结果按@name 属性很好地排序 - 但通过 php-transform 不是)
这是一个代码片段:
文件
<?xml version="1.0" encoding="utf-8"?>
<user>
<clients>
<c name="A_client" id="1" generated="2013-04-17" p_count="1"/>
<c name="B_client" id="2" generated="2013-04-25" p_count="0"/>
<c name="C_client" id="3" generated="2013-04-26 23:35" p_count="0"/>
</clients>
</user>
XSL 文件
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html"/>
<xsl:template match="user">
<ul class="topiclist">
<xsl:for-each select="clients/c">
<xsl:sort select="@name"/>
<li class="round_corner_3"><xsl:value-of select="@name"/></li>
</xsl:for-each>
</ul>
</xsl:template>
</xsl:stylesheet>
PHP 函数
function xsl_transform_xml($xsl_file, $xml_file) {
$xslDoc = new DOMDocument();
$xslDoc -> load($xsl_file);
$xmlDoc = new DOMDocument();
$xmlDoc -> load($xml_file);
$proc = new XSLTProcessor();
$proc -> importStylesheet($xslDoc);
return $proc -> transformToXML($xmlDoc);
}
是的,没错——但是当 xml 代码变得更详细时,输出会以一种奇怪的方式排序。
使用这个 xml 文件:
<?xml version="1.0" encoding="utf-8"?>
<user>
<clients>
<c name="C_client" id="3" generated="2013-04-26 23:35" p_count="0"/>
<c name="B_client" id="2" generated="2013-04-25" p_count="0"/>
<c name="cone" id="1" generated="2013-04-17" p_count="1"/>
<c name="c_two" id="1" generated="2013-04-17" p_count="1"/>
<c name="cthree" id="1" generated="2013-04-17" p_count="1"/>
<c name="Hoff" id="1" generated="2013-04-17" p_count="1"/>
<c name="Nimu" id="1" generated="2013-04-17" p_count="1"/>
<c name="Xing" id="1" generated="2013-04-17" p_count="1"/>
<c name="Whatever" id="1" generated="2013-04-17" p_count="1"/>
</clients>
</user>
php处理的结果是:
B_client
C_client
Hoff
Nimu
Whatever
Xing
c_two
cone
cthree
当 xml 文件直接在浏览器中打开时(添加了 xsl 文件路径)
B_client
C_client
c_two
cone
cthree
Hoff
Nimu
Whatever
Xing
(编辑)
不知道发布我的 libxslt 版本是否有帮助,但如果有,那就是:1.1.24