我正在寻找几天但却无法找到解决方案。我使用php的XSLTProcessor方法输出由xsl文件转换的xml文件。
除了xsl文件中的sort函数外,一切都很完美。
(为了测试我在xml文件中添加了xsl-file-path并直接在Firefox中打开它:结果按@name属性排序 - 但是通过php-transform它没有)
以下是代码段:
XML文件
<?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 FILE
<?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
答案 0 :(得分:0)
使用libxslt 1.1.25,您可以使用lang
xsl:sort
属性,它可以在大多数操作系统上执行您想要的操作。
使用libxslt 1.1.24,您应该对字符串的小写版本进行排序。不幸的是,XPath 1.0中没有lower-case
函数。您所能做的就是使用translate
并手动指定字符集。使用纯ASCII,以下工作:
<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="translate(@name, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')" lang="de"/>
<li class="round_corner_3"><xsl:value-of select="@name"/></li>
</xsl:for-each>
</ul>
</xsl:template>
</xsl:stylesheet>