以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 XSL/XSLT/XSL-FO/CSS 』  (http://bbs.xml.org.cn/list.asp?boardid=8)
----  问个position()的问题  (http://bbs.xml.org.cn/dispbbs.asp?boardid=8&rootid=&id=39939)


--  作者:211211211
--  发布时间:11/12/2006 2:06:00 PM

--  问个position()的问题
代码如下:
test.xml
<NewDataSet>
  <table>...</table>
  <table>...</table>
</NewDataSet>

test.xsl
<?xml version="1.0" encoding="utf-8"?>

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

<xsl:template match="/NewDataSet">

  <table>
      <xsl:for-each select="table[position()&gt;10 and position()&lt;30]" >

        <xsl:if test="position() mod 5=1">
          <xsl:variable name="nowP" select="position()"></xsl:variable>
      <tr>

        <td style="background-color:green">
          <xsl:value-of select="$nowP"></xsl:value-of>
        </td>
      </tr>
        </xsl:if>
      </xsl:for-each>
    </table>

  </xsl:template>

</xsl:stylesheet>

输出为:
1
6
11
16
...

可以看出,position()不是从table[position()&gt;10 and position()&lt;30]" 的 范围开始计数,而是从头开始,如果想要得到
11
16
21
...
的效果,应该怎么做?急用!谢谢。


另外,在一个别的地方要引用 <xsl:for-each select="Table[position()&gt;=1 and position() &lt;= 15]">中的select属性,不知道怎么才可以定位到这个属性,这个select属性已经不是第一个,可不可以用start-with实现?select="//@select[start-with('Table')]"?



--  作者:211211211
--  发布时间:11/12/2006 3:54:00 PM

--  
怎么没有人理我?在线等,自己顶一个。
--  作者:211211211
--  发布时间:11/12/2006 7:17:00 PM

--  
对于第二个问题,我试了
document.XSLDocument.selectSingleNode("//*[start-with(@select,'Table')]");
就是定位不到。

--  作者:fukui
--  发布时间:11/13/2006 12:48:00 PM

--  
我吃完饭后帮你看看...
--  作者:211211211
--  发布时间:11/13/2006 1:22:00 PM

--  
呵呵,等待中。。
--  作者:fukui
--  发布时间:11/13/2006 2:28:00 PM

--  
呵呵,没研究出来,请斑竹吧
--  作者:211211211
--  发布时间:11/13/2006 4:43:00 PM

--  
请斑竹出来解答一下吧,一直在等。
--  作者:Qr
--  发布时间:11/13/2006 6:02:00 PM

--  
实际上是你的代码没写好,position()这个东东很容易用错地方,慢慢理解吧。
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="NewDataSet">

  <table>
      <xsl:for-each select="table[position()&gt;10 and position()&lt;30 and position() mod 5=1]" ><!--这里的position()反映XML的position()-->

      <tr>

        <td>
          <xsl:value-of select="position()"></xsl:value-of><!--这里的position()反映过滤后的position()-->
        </td>
        <td style="background-color:green">
          <xsl:value-of select="."></xsl:value-of>
        </td>
      </tr>

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

  </xsl:template>

</xsl:stylesheet>


--  作者:211211211
--  发布时间:11/13/2006 7:58:00 PM

--  
呵呵,学习中,谢谢斑竹,另一个问题中
document.XSLDocument.selectSingleNode("//*[start-with(@select,'Table')]");
为什么定位不到 <xsl:for-each select="Table[position()&gt;=1 and position() &lt;= 15]">的select属性?应该怎么定位?
--  作者:211211211
--  发布时间:11/13/2006 8:29:00 PM

--  
还是不行。
我干脆把整个代码贴出,代码是基于Qr的动态分页代码改的。
test.xml
<?xml version="1.0" encoding="utf-8" ?>

<NewDataSet>
  <Table>
    <ssID>12</ssID>
    <ssName>反对体系的力量</ssName>
    <PicfilePath>D:\works\</PicfilePath>
    <DownloadCount>1</DownloadCount>
  </Table>
  <Table>
    <ssID>13</ssID>
    <ssName>美国和体系</ssName>
    <PicfilePath>D:\works\</PicfilePath>
    <DownloadCount>2</DownloadCount>
  </Table>
....
</NewDataSet>

test.xsl

<?xml version="1.0" encoding="utf-8"?>

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

  <xsl:template match="/">
    <html>
      <head>
        <script>
          <xsl:comment>
            <![CDATA[
               var OnePageNum=15;
               var PageNum=1;
               var XMLPageNum=1;
                 function pages(Num)
                  {
                     stylesheet=document.XSLDocument;
                     source=document.XMLDocument;
                     nodes=source.documentElement.childNodes;
                     len=nodes.length;
                       for(i=1;i<=(len/OnePageNum);i++);
                        XMLPageNum=i;
                        var firstNum=0;
                        var lastNume=0;

                      if (Num=="first") {PageNum=1;}
                      if (Num=="previous") {if (PageNum>1) PageNum -=1;}
                      if (Num=="next") {if (PageNum<XMLPageNum) PageNum +=1;}
                      if (Num=="last") {PageNum =XMLPageNum;}

                      [color=#FF0000]sortField=document.XSLDocument.selectSingleNode("\\*[start-with(@select,'Table')]");[/color]

                      firstNum=OnePageNum*(PageNum-1)+1;
                      lastNum=OnePageNum*(PageNum-1)+OnePageNum;
                      text="position()>="+firstNum+" and position()<="+lastNum;

                       sortField.text=text;

                       Layer1.innerHTML=source.documentElement.transformNode(stylesheet);
                  }
            ]]>
          </xsl:comment>
        </script>
      </head>

      <body>


        <table align="center" width="500" >
          <tr>
            <td>
              <button id="cmdfirstPage" class="keybutton" onclick="pages('first');">首页</button>
              <button id="cmdpreviousPage" class="keybutton" onclick="pages('previous');" >上一页</button>
              <button id="cmdnextPage" class="keybutton" onclick="pages('next');">下一页</button>
              <button id="cmdlastPage" class="keybutton" onclick="pages('last');">尾页</button>
            </td>
          </tr>
        </table>
        <div id="Layer1" name="Layer1">
          <xsl:apply-templates select="NewDataSet" />
        </div>
      </body>

    </html>
  </xsl:template>

  <xsl:template match="/NewDataSet">
    <xsl:param name="totalItems">15</xsl:param>
    <table width="100%" border="0" cellpadding="0" cellspacing="0">
      <xsl:for-each  select="Table[position()&gt;=15 and position() &lt;= 30 and position() mod 5=1]">
        <xsl:variable select="position()" name="nowP"></xsl:variable>
        <tr>
          <xsl:value-of select="position()"/>
        </tr>
          <tr>
            <td>
              <table width="139" height="154" border="0" cellpadding="0" cellspacing="0">
                <tr>
                  <td colspan="2">
                    <div align="center">
                      <a href="" >
                        <img width="64" height="102" border="0" class="n_img_big" >
                          <xsl:attribute name="src">
                            ../images/<xsl:value-of select="../Table[$nowP]/ssName"/>/2.jpg
                          </xsl:attribute>
                        </img>
                      </a>
                    </div>
                  </td>
                </tr>

                <tr>
                  <td width="70%">
                    <div align="right">下载次数:</div>
                  </td>
                  <td class="n_text">

                    <xsl:value-of select="../Table[$nowP]/DownloadCount"/>
                  </td>
                </tr>
              </table>
            </td>
            <td>
              <table width="139" height="154" border="0" cellpadding="0" cellspacing="0">
                <tr>
                  <td colspan="2">
                    <div align="center">
                      <a href="" >
                        <img width="66" height="99" border="0" class="n_img_big" >
                          <xsl:attribute name="src">
                            ../images/<xsl:value-of select="../Table/$nowP+1]/ssName"/>/2.jpg
                          </xsl:attribute>
                        </img>
                      </a>
                    </div>
                  </td>
                </tr>

                <tr>
                  <td width="70%">
                    <div align="right">下载次数:</div>
                  </td>
                  <td class="n_text">

                    <xsl:value-of select="../Table[$nowP+1]/DownloadCount"/>
                  </td>
                </tr>
              </table>
            </td>
            <td>
              <table width="139" height="154" border="0" cellpadding="0" cellspacing="0">
                <tr>
                  <td colspan="2">
                    <div align="center">
                      <a href="" >
                        <img src="" width="66" height="98" border="0" class="n_img_big" >
                          <xsl:attribute name="src">
                            ../images/<xsl:value-of select="../Table/[$nowP+2]/ssName"/>/2.jpg
                          </xsl:attribute>
                        </img>
                      </a>
                    </div>
                  </td>
                </tr>

                <tr>
                  <td width="70%">
                    <div align="right">下载次数:</div>
                  </td>
                  <td class="n_text">
                    <xsl:value-of select="../Table[$nowP+2]/DownloadCount"/>
                  </td>
                </tr>
              </table>
            </td>
            <td>
              <table width="139" height="154" border="0" cellpadding="0" cellspacing="0">
                <tr>
                  <td colspan="2">
                    <div align="center">
                      <a href="" >
                        <img  width="66" height="98" border="0" class="n_img_big" >
                          <xsl:attribute name="src">
                            ../images/<xsl:value-of select="../Table[$nowP+3]/ssName"/>/2.jpg
                          </xsl:attribute>
                        </img>
                      </a>
                    </div>
                  </td>
                </tr>

                <tr>
                  <td width="70%">
                    <div align="right">下载次数:</div>
                  </td>
                  <td class="n_text">
                    <xsl:value-of select="../Table[$nowP+3]/DownloadCount"/>
                  </td>
                </tr>
              </table>
            </td>
            <td>
              <table width="139" height="154" border="0" cellpadding="0" cellspacing="0">
                <tr>
                  <td colspan="2">
                    <div align="center">
                      <a href="" >
                        <img width="74" height="88" border="0" class="n_img_big" >
                          <xsl:attribute name="src">
                            ../images/<xsl:value-of select="../Table[$nowP+4]/ssName"/>/2.jpg
                          </xsl:attribute>
                        </img>
                      </a>
                    </div>
                  </td>
                </tr>

                <tr>
                  <td width="70%">
                    <div align="right">下载次数:</div>
                  </td>
                  <td class="n_text">
                    <xsl:value-of select="../Table[$nowP+4]/DownloadCount"/>
                  </td>
                </tr>
              </table>
            </td>
          </tr>
  
      </xsl:for-each>
    </table>
  </xsl:template>

</xsl:stylesheet>

注:附图为结果
1
2
3

而不是预期的
16
21
26
而且由于定位不到 <xsl:for-each select="Table[position()&gt;=15 and position() &lt;= 30 and position() mod 5=1]">的select属性,上下翻页无效。请Qr帮忙指点一下。这个问题困扰我好几天了。


此主题相关图片如下:
按此在新窗口浏览图片


--  作者:Qr
--  发布时间:11/14/2006 9:35:00 AM

--  
错了!


[此贴子已经被作者于2006-11-15 8:54:45编辑过]

--  作者:Qr
--  发布时间:11/14/2006 9:43:00 AM

--  
每遇到分页就统计错误,贴子又不显示:(


--  作者:211211211
--  发布时间:11/14/2006 2:32:00 PM

--  
问一句,把我的代码怎样改一下就可以实现分页的功能?
能不能给我个具体的修改后代码?

很着急,几天了,这个问题一直没有得到解决。请斑竹给个最终解决方案。


--  作者:Qr
--  发布时间:11/14/2006 3:14:00 PM

--  
<?xml version="1.0" encoding="utf-8"?>

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

  <xsl:template match="/">
    <html>
      <head>
        <script>
          <xsl:comment>
            <![CDATA[
               var OnePageNum=15;
               var PageNum=1;
               var XMLPageNum=1;
                 function pages(Num)
                  {
                     stylesheet=document.XSLDocument;

                     source=document.XMLDocument;
                     nodes=source.documentElement.childNodes;
                     len=nodes.length;
                       for(i=1;i<=(len/OnePageNum);i++);
                        XMLPageNum=i;
                        var firstNum=0;
                        var lastNume=0;

                      if (Num=="first") {PageNum=1;}
                      if (Num=="previous") {if (PageNum>1) PageNum -=1;}
                      if (Num=="next") {if (PageNum<XMLPageNum) PageNum +=1;}
                      if (Num=="last") {PageNum =XMLPageNum;}

                      //sortField=document.XSLDocument.selectSingleNode("NewDataSet[start-with(@select,'Table')]");
                      sortField=stylesheet.selectSingleNode("//xsl:for-each/@select");

                      firstNum=OnePageNum*(PageNum-1)+1;
                      lastNum=OnePageNum*(PageNum-1)+OnePageNum;
                      text="position()>="+firstNum+" and position()<="+lastNum;

                       sortField.text="Table["+text+" and position() mod 5=1]";

                       Layer1.innerHTML=source.documentElement.transformNode(stylesheet);
                  }
            ]]>
          </xsl:comment>
        </script>
      </head>

      <body>


        <table align="center" width="500" >
          <tr>
            <td>
              <button id="cmdfirstPage" class="keybutton" onclick="pages('first');">首页</button>
              <button id="cmdpreviousPage" class="keybutton" onclick="pages('previous');" >上一页</button>
              <button id="cmdnextPage" class="keybutton" onclick="pages('next');">下一页</button>
              <button id="cmdlastPage" class="keybutton" onclick="pages('last');">尾页</button>
            </td>
          </tr>
        </table>
        <div id="Layer1" name="Layer1">
          <xsl:apply-templates select="NewDataSet" />
        </div>
      </body>

    </html>
  </xsl:template>


  <xsl:template match="NewDataSet">
    <xsl:param name="totalItems">15</xsl:param>
    <table width="100%" border="0" cellpadding="0" cellspacing="0">
      <xsl:for-each  select="Table[position()&gt;=10 and position() &lt;= 30 and position() mod 5=1]">
        <xsl:variable select="position()" name="nowP"></xsl:variable>
        <tr>
          <xsl:value-of select="position()"/>
        </tr>
          <tr>
            <td>
              <table width="139" height="154" border="0" cellpadding="0" cellspacing="0">
                <tr>
                  <td colspan="2">
                    <div align="center">
                      <a href="" >
                        <img width="64" height="102" border="0" class="n_img_big" >
                          <xsl:attribute name="src">
                            ../images/<xsl:value-of select="../Table[$nowP]/ssName"/>/2.jpg
                          </xsl:attribute>
                        </img>
                      </a>
                    </div>
                  </td>
                </tr>

                <tr>
                  <td width="70%">
                    <div align="right">下载次数:</div>
                  </td>
                  <td class="n_text">

                    <xsl:value-of select="../Table[$nowP]/DownloadCount"/>
                  </td>
                </tr>
              </table>
            </td>
            <td>
              <table width="139" height="154" border="0" cellpadding="0" cellspacing="0">
                <tr>
                  <td colspan="2">
                    <div align="center">
                      <a href="" >
                        <img width="66" height="99" border="0" class="n_img_big" >
                          <xsl:attribute name="src">
                            ../images/<xsl:value-of select="../Table[$nowP+1]/ssName"/>/2.jpg
                          </xsl:attribute>
                        </img>
                      </a>
                    </div>
                  </td>
                </tr>

                <tr>
                  <td width="70%">
                    <div align="right">下载次数:</div>
                  </td>
                  <td class="n_text">

                    <xsl:value-of select="../Table[$nowP+1]/DownloadCount"/>
                  </td>
                </tr>
              </table>
            </td>
            <td>
              <table width="139" height="154" border="0" cellpadding="0" cellspacing="0">
                <tr>
                  <td colspan="2">
                    <div align="center">
                      <a href="" >
                        <img src="" width="66" height="98" border="0" class="n_img_big" >
                          <xsl:attribute name="src">
                            ../images/<xsl:value-of select="../Table[$nowP+2]/ssName"/>/2.jpg
                          </xsl:attribute>
                        </img>
                      </a>
                    </div>
                  </td>
                </tr>

                <tr>
                  <td width="70%">
                    <div align="right">下载次数:</div>
                  </td>
                  <td class="n_text">
                    <xsl:value-of select="../Table[$nowP+2]/DownloadCount"/>
                  </td>
                </tr>
              </table>
            </td>
            <td>
              <table width="139" height="154" border="0" cellpadding="0" cellspacing="0">
                <tr>
                  <td colspan="2">
                    <div align="center">
                      <a href="" >
                        <img  width="66" height="98" border="0" class="n_img_big" >
                          <xsl:attribute name="src">
                            ../images/<xsl:value-of select="../Table[$nowP+3]/ssName"/>/2.jpg
                          </xsl:attribute>
                        </img>
                      </a>
                    </div>
                  </td>
                </tr>

                <tr>
                  <td width="70%">
                    <div align="right">下载次数:</div>
                  </td>
                  <td class="n_text">
                    <xsl:value-of select="../Table[$nowP+3]/DownloadCount"/>
                  </td>
                </tr>
              </table>
            </td>
            <td>
              <table width="139" height="154" border="0" cellpadding="0" cellspacing="0">
                <tr>
                  <td colspan="2">
                    <div align="center">
                      <a href="" >
                        <img width="74" height="88" border="0" class="n_img_big" >
                          <xsl:attribute name="src">
                            ../images/<xsl:value-of select="../Table[$nowP+4]/ssName"/>/2.jpg
                          </xsl:attribute>
                        </img>
                      </a>
                    </div>
                  </td>
                </tr>

                <tr>
                  <td width="70%">
                    <div align="right">下载次数:</div>
                  </td>
                  <td class="n_text">
                    <xsl:value-of select="../Table[$nowP+4]/DownloadCount"/>
                  </td>
                </tr>
              </table>
            </td>
          </tr>
  
      </xsl:for-each>
    </table>
  </xsl:template>

</xsl:stylesheet>


--  作者:211211211
--  发布时间:11/14/2006 4:30:00 PM

--  
呵呵,谢谢斑竹,我测试了一下,功能只实现了一半,能找到那个节点的select属性了,但是还是position()的问题不能翻页
<xsl:for-each  select="Table[position()&gt;=10 and position() &lt;= 30 and position() mod 5=1]">
        <xsl:variable select="position()" name="nowP"></xsl:variable>
        <tr>
          <xsl:value-of select="position()"/>
        </tr>

这里输出的还是
1
2
3
4
而不是预测的
11
16
21
26
再要麻烦斑竹解答一下。


--  作者:Qr
--  发布时间:11/15/2006 9:42:00 AM

--  
看你的代码偶就头疼,代码完全不符合偶的风格,而且一大堆垃圾代码。

你没有看清偶在8楼的回复,<xsl:for-each  select="Table[position()&gt;=10 and position() &lt;= 30 and position() mod 5=1]">已经过滤了所有不符合条件的记录,故你在xsl:for-each 中取得的position()都不是原XML中的实际position()。要取得XML中的实际position(),就必须在[position()&gt;=10 and position() &lt;= 30 and position() mod 5=1]之前实现,所以,你的代码可能要重写,或者找找其中的对应关系,看如何将1、2、3、4变换为11、16、21、26。


W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
234.375ms