Search code examples
phpxmlpagination

passing parameters in xml


i'm trying to implement paging in xml using this code and got around to making it work. while it works perfectly, there is a small issue, that when i click on the NEXT button, it keeps reloading the page with the same initial records. it does not take the user to the next page.

i came across this link wherein the poster had a similar issue, and it seems from the answers parameters need to be passed. however, the guy in that link was using MM_XSLTransform, while i'm not. hence when i try to implement this code in index.php:

$xsl->addParameter("Page", $_GET["Page"]);
$xsl->addParameter("PageSize", $_GET["PageSize"]);

it throws an error:

Fatal error: Call to undefined method XSLTProcessor::addParameter() 

UPDATED

php code:

<?php
        error_reporting(E_ALL);
        ini_set("display_errors", 1);

            $xmldoc = new DOMDocument();
            if(!file_exists('test.xml')){
              echo "Sorry this file does not exists!";
              exit();
            } else {
                $xmldoc->load('test.xml', LIBXML_NOBLANKS);

               // Load up the XSL file
                $xslDoc = new DomDocument;
                $xslDoc->load("test.xsl");
                $xsl = new XSLTProcessor;
                $xsl->importStyleSheet($xslDoc);

                $xsl->setParameter(null, 'Page', $_GET['Page']);
                $xsl->setParameter(null, 'PageSize', $_GET['PageSize']);

                // apply the transformation
                echo $xsl->transformToXml($xmldoc);

            } 
?>

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" />

<!-- XML Parameters -->
<xsl:param name="Page" select="0" />
<xsl:param name="PageSize" select="5" />

<xsl:template match="/">

<xsl:variable name="mycount" select="count(root/verse)"/>
<xsl:variable name="selectedRowCount" select="floor((number($mycount)-1) div $PageSize)+1"/>

<div>
    <div>
        <xsl:value-of select="root/title"/>
    </div>
    <div>
        <p><xsl:value-of select="root/introduction"/></p>
    </div>
    <div>

            <xsl:for-each select="root/verse">  

                <xsl:if test="position() &gt;= ($Page * $PageSize) + 1">
                <xsl:if test="position() &lt;= $PageSize + ($PageSize * $Page)">

                    <div><xsl:value-of select="p"/></div> <br />
                    <div><xsl:value-of select="trla"/></div> <br />
                    <div><xsl:value-of select="trli"/></div> <br />

                </xsl:if>
                </xsl:if>
            </xsl:for-each>


            <!-- Prev link for pagination -->
              <xsl:choose>
               <xsl:when test="number($Page)-1 &gt;= 0">&#160;
                <A>
                 <xsl:attribute name="href">index.php?page=<xsl:value-of select="number($Page)-1"/>&amp;pagesize=<xsl:value-of select="$PageSize"/></xsl:attribute>
                  &lt;&lt;Prev
                </A>
               </xsl:when>
               <xsl:otherwise>
                <!-- display something else -->
               </xsl:otherwise>
              </xsl:choose>

              <xsl:if test="$selectedRowCount &gt; 1">
               &#160;<b class="blacktext"><xsl:value-of select="number($Page)+1"/>&#160;of&#160;<xsl:value-of select="number($selectedRowCount)"/></b>&#160;
              </xsl:if>

              <!-- Next link for pagination -->
              <xsl:choose>
               <xsl:when test="number($Page)+1 &lt; number($selectedRowCount)">&#160;
                <A>
                 <xsl:attribute name="href">index.php?page=<xsl:value-of select="number($Page)+1"/>&amp;pagesize=<xsl:value-of select="$PageSize"/></xsl:attribute>
                  Next&gt;&gt;
                </A>
               </xsl:when>
               <xsl:otherwise>
                <!-- display something else -->
               </xsl:otherwise>
              </xsl:choose>

    </div>

</div>

</xsl:template>
</xsl:stylesheet>

Solution

  • Take a look at the documentation of the xsl module. You will find a setParameter method.

    edit: e.g.

    <?php
    $doc = new DOMDocument;
    $doc->loadxml('<a />');
    $proc = getProcessor();
    $proc->setParameter(null, 'Page', '99');
    $proc->setParameter(null, 'PageSize', '11');
    echo $proc->transformToXML($doc);
    
    function getProcessor() {
      $doc = new DOMDocument;
      $doc->loadxml('<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:output method="text" />
        <xsl:param name="Page" select="0" />
        <xsl:param name="PageSize" select="1" />
        <xsl:template name="results" match="/">
          Page: <xsl:value-of select="$Page" />
          PageSize: <xsl:value-of select="$PageSize" />
        </xsl:template>
      </xsl:stylesheet>');
      $xsl = new XSLTProcessor();
      $xsl->importStyleSheet($doc);
    
      return $xsl;
    }
    

    prints

    Page: 99
    PageSize: 11
    

    edit2: Try

    <?php
    $page = isset($_GET['Page']) ? intval($_GET['Page']) : 0;
    
    $proc = getProcessor();
    $proc->setParameter(null, 'Page', $page);
    $proc->setParameter(null, 'PageSize', '11');
    $doc = getDoc();
    echo $proc->transformToXML($doc);
    
    function getProcessor() {
      $doc = new DOMDocument;
      $doc->loadxml('<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:output method="html" />
        <xsl:param name="Page" select="0" />
        <xsl:param name="PageSize" select="1" />
        <xsl:template name="results" match="/">
          Page: <xsl:value-of select="$Page" />
          PageSize: <xsl:value-of select="$PageSize" />
          <hr />
          <a><xsl:attribute name="href">?Page=<xsl:value-of select="($Page)-1" /></xsl:attribute>Prev</a>
          |
          <a><xsl:attribute name="href">?Page=<xsl:value-of select="($Page)+1" /></xsl:attribute>Next</a>
        </xsl:template>
      </xsl:stylesheet>');
      $xsl = new XSLTProcessor();
      $xsl->importStyleSheet($doc);
    
      return $xsl;
    }
    
    function getDoc() {
      $doc = new DOMDocument;
      $doc->loadxml('<a></a>');
      return $doc;
    }
    

    edit3: In your code you have

    index.php?page=<xsl:value-of select="number($Page)-1"/>
    

    Either use $_GET['page'] instead of $_GET['Page'] or change the template to index.php?Page=<xsl:value .... Same with PageSize/pagesize.