在xml中传递参数
问题描述:
我试图在xml中使用this code实现分页,并着手使其工作。虽然它完美的工作,但有一个小问题,即当我点击NEXT按钮时,它会使用相同的初始记录重新加载页面。它不会将用户带到下一页。在xml中传递参数
我遇到了this link其中海报有类似的问题,它似乎从答案参数需要通过。然而,该链接中的人使用MM_XSLTransform,而我不是。因此,当我尝试实现这个代码的index.php:
$xsl->addParameter("Page", $_GET["Page"]);
$xsl->addParameter("PageSize", $_GET["PageSize"]);
它抛出一个错误:
Fatal error: Call to undefined method XSLTProcessor::addParameter()
修订
PHP代码:
<?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() >= ($Page * $PageSize) + 1">
<xsl:if test="position() <= $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 >= 0"> 
<A>
<xsl:attribute name="href">index.php?page=<xsl:value-of select="number($Page)-1"/>&pagesize=<xsl:value-of select="$PageSize"/></xsl:attribute>
<<Prev
</A>
</xsl:when>
<xsl:otherwise>
<!-- display something else -->
</xsl:otherwise>
</xsl:choose>
<xsl:if test="$selectedRowCount > 1">
 <b class="blacktext"><xsl:value-of select="number($Page)+1"/> of <xsl:value-of select="number($selectedRowCount)"/></b> 
</xsl:if>
<!-- Next link for pagination -->
<xsl:choose>
<xsl:when test="number($Page)+1 < number($selectedRowCount)"> 
<A>
<xsl:attribute name="href">index.php?page=<xsl:value-of select="number($Page)+1"/>&pagesize=<xsl:value-of select="$PageSize"/></xsl:attribute>
Next>>
</A>
</xsl:when>
<xsl:otherwise>
<!-- display something else -->
</xsl:otherwise>
</xsl:choose>
</div>
</div>
</xsl:template>
</xsl:stylesheet>
答
看一看documentation of the xsl module。你会发现一个集合参数方法。
编辑:例如
<?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;
}
打印
Page: 99
PageSize: 11
EDIT2:尝试
<?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:在你的代码有
index.php?page=<xsl:value-of select="number($Page)-1"/>
使用$ _GET ['p age']而不是$ _GET ['P age']或将模板更改为index.php?Page=<xsl:value ...
。与PageSize/pagesize相同。
您确实需要将语言添加到标签以及您正在使用的xslt处理器。他们有分歧,重要的是要知道哪个是哪个。 – Oded 2010-07-30 20:54:49
感谢您的指针。我正在使用内置的php xslt处理器。 – input 2010-07-30 21:12:39