0

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

4

1 回答 1

0

使用 libxslt 1.1.25,您可以使用 which 的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>
于 2013-05-03T16:49:39.807 回答