使用变量进行XSLT动态排序

时间:2014-12-09 05:24:25

标签: sorting xslt

我正在尝试根据从下拉列表中传递的值进行动态排序。我将它们设置为变量并在排序中使用它们。

我正在使用XSLT 1.0版。

以下是代码:

test.php文件 -

<?php

mysql_connect('localhost','root','') or die(mysql_error());
mysql_select_db('testxslt');

$xml = new SimpleXMLElement( "<?xml version='1.0' ?>\n".           
         "<?xml-stylesheet type='text/xsl' href='xml_stylesort.xsl' ?>\n". 
               "<items></items>");             

$_POST['sort_by']='price_desc';

//for sorting
if(isset($_POST['sort_by']) && !empty($_POST['sort_by'])){
          $arr = explode('_', $_POST['sort_by']);

          if($arr[1] == "asc")      $sortorder = 'ascending';
          if($arr[1] == "desc")      $sortorder = 'descending';

          // xml_appendNode($objXmlDom, $objDocNode, "sortby",$arr[0]);
           $xml->addChild( "sortby",$arr[0]);

              $xml->addChild( "sortorder",$sortorder);

         // xml_appendTextNode($objXmlDom, $objDocNode, "sortorder", $sortorder);

          if($arr[0] == "price")      $type = 'number';
          else                                  $type = 'text';

          $xml->addChild( "sorttype", $type);
        //  xml_appendTextNode($objXmlDom, $objDocNode, "sorttype", $type);

}


$sql = mysql_query("select * from items") or die(mysql_error());

while($row=mysql_fetch_object($sql))
{
    $item = $xml->addChild('item');
    $item->addAttribute('id', $row->id);
    $item->addChild('name', $row->name);
    $item->addChild('qty', $row->qty);
    $item->addChild('price', $row->price);
}


Header('Content-type: text/xml');
print($xml->asXML());

?>

xslt文件:

<?xml version="1.0" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">



    <xsl:variable name="sortby">
            <xsl:choose>
                <xsl:when test="sortby != ''">
                    <xsl:value-of select="items/sortby" />
                </xsl:when>
                <xsl:otherwise>
                    <xsl:value-of select="'price'" />
                </xsl:otherwise>
            </xsl:choose>
        </xsl:variable>


          <xsl:variable name="sorttype">
            <xsl:choose>
                <xsl:when test="sorttype != ''">
                    <xsl:value-of select="items/sorttype" />
                </xsl:when>
                <xsl:otherwise>
                    <xsl:value-of select="'text'" />
                </xsl:otherwise>
            </xsl:choose>
        </xsl:variable>


         <xsl:variable name="sortorder">
            <xsl:choose>
                <xsl:when test="sortorder != ''">
                    <xsl:value-of select="items/sortorder" />
                </xsl:when>
                <xsl:otherwise>
                    <xsl:value-of select="'ascending'" />
                </xsl:otherwise>
            </xsl:choose>
        </xsl:variable>

    <xsl:template match="/">
      <html>
      <body>
      <h2>Item List</h2>


          <div style="margin:20px;">
          <label>Sort by:      | <xsl:value-of select="items/sortby" /> | <xsl:value-of select="items/sorttype" /> | <xsl:value-of select="items/sortorder" />  </label>
                     <form id="sortform" method="post">
                        <select name="sort_by"  onchange="javascript:document.getElementById('sortform').submit();">
                            <option> Select </option>
                                 <option  value="price_asc">Price ASC</option>
                                     <option value="price_desc">Price DESC</option>
                                 <option  value="name_asc">Name ASC</option>
                                 <option  value="name_desc">Name DESC</option>
                        </select>
                     </form>
          </div>
      <table border="1">
        <tr bgcolor="#9acd32">
          <th>Item</th>
          <th>Price</th>
          <th>Quantity</th>
          <th>Total</th>
        </tr>
        <xsl:for-each select="items/item">

                                               <xsl:sort data-type="{$sorttype}" select="*[name()=$sortby]"  order="{$sortorder}"  /> 

                <tr>
                  <td><xsl:value-of select="name"/></td>
                  <td><xsl:value-of select="price"/></td>
                  <td><xsl:value-of select="qty"/></td>
                  <td><xsl:value-of select="qty * price"/></td>
                </tr>
             </xsl:for-each>
      </table>
      </body>
      </html>
    </xsl:template>

</xsl:stylesheet>

2 个答案:

答案 0 :(得分:0)

使用您的代码无法重现问题。我看到的一件事是你试图排序:

select="@*[name()=$sortby]"

但您的product个节点没有属性。也许你的意思是排序:

select="*[name()=$sortby]"

答案 1 :(得分:0)

我认为您遇到的问题是在XSLT开头设置三个变量

<xsl:variable name="sortby">
    <xsl:choose>
        <xsl:when test="sortby != ''">
            <xsl:value-of select="items/sortby" />
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="'price'" />
        </xsl:otherwise>
    </xsl:choose>
</xsl:variable>

xsl:when的条件不正确。它正在文档节点下寻找一个sortby元素,该元素不存在,因为根元素实际上是items

应该如下:

 <xsl:when test="items/sortby != ''">

与其他两个变量类似。

顺便说一句,看起来您正在使用xsl:stylesheet处理指令编写XML以在客户端上进行转换。如果你是PHP,你应该在服务器上进行XML的转换,然后只写出HTML结果。这样你就可以让PHP将排序值作为参数传递,而不是将它们附加到XML。