php transformToXML方法忽略排序

时间:2013-05-01 00:46:11

标签: php sorting xslt

我正在寻找几天但却无法找到解决方案。我使用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

1 个答案:

答案 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>