以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 XSL/XSLT/XSL-FO/CSS 』  (http://bbs.xml.org.cn/list.asp?boardid=8)
----  怎样在一个XML中随机取出两个节点的信息?  (http://bbs.xml.org.cn/dispbbs.asp?boardid=8&rootid=&id=49674)


--  作者:jacky_zh
--  发布时间:7/10/2007 3:59:00 PM

--  怎样在一个XML中随机取出两个节点的信息?
比如,XML文件如下:
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type='text/xsl' href='hot.xsl'?>
<page>
  <unit type="pic">
    <imgfilename>www.chaotex.com-2007-06-25-13-51-59-5703.PNG</imgfilename>
    <return>yes</return>
  </unit>
  <unit type="literal">
    <word>轮转推荐</word>
    <return>yes</return>
  </unit>
  <unit type="product">
    <name>[铃]李宇春-我的心里只有你没有他</name>
    <type>cmt_ring</type>
    <productid>577</productid>
    <return>yes</return>
  </unit>
  <unit type="product">
    <name>[铃]最能让人把所有的烦心事全部忘掉的铃声!!!</name>
    <type>cmt_ring</type>
    <productid>547</productid>
    <return>yes</return>
  </unit>
  <unit type="product">
    <name>[铃]高品质铃声韩雪《飘雪》</name>
    <type>cmt_ring</type>
    <productid>538</productid>
    <return>yes</return>
  </unit>
  <unit type="product">
    <name>[铃]《骑士精神》节奏感超强</name>
    <type>cmt_ring</type>
    <productid>525</productid>
    <return>yes</return>
  </unit>
  </page>
请问,怎么写XSL可以随机得到其中两个unit节点的信息?
--  作者:hexun831012
--  发布时间:7/10/2007 4:58:00 PM

--  
impossible
--  作者:jacky_zh
--  发布时间:7/11/2007 11:10:00 AM

--  
这个问题已经解决啦~,把代码贴一下,大家遇到类似问题可以依此解决~

XML:

<?xml   version="1.0"   encoding="UTF-8"?>   
  <root>   
  <row>1</row>   
  <row>2</row>   
  <row>3</row>   
  <row>4</row>   
  <row>5</row>   
  <row>6</row>   
  <row>7</row>   
  <row>8</row>   
  <row>9</row>   
  <row>10</row>   
  </root>   
    
XSL:   
    
  <?xml   version="1.0"?>   
  <xsl:stylesheet   xmlns:xsl="http://www.w3.org/1999/XSL/Transform"   
      xmlns:msxsl="urn:schemas-microsoft-com:xslt"   
      xmlns:ssm1226="http://www.ssm1226.com"   
      version="1.0">   
  <msxsl:script   language="JavaScript"   implements-prefix="ssm1226">   
  <![CDATA[   
  var   s=",";   
  function   Random()   
  {   
  var   i=Math.ceil(Math.random()   *   10);   
  if(s.indexOf(','   +   i   +   ",")>=0)   
  {   
  return   Random();   
  }   
  else   
  {   
  s   +=   i   +   ","   
  return   i;   
  }   
  }   
  ]]>   
  </msxsl:script>   
    
  <xsl:template   match="/">   
  <xsl:call-template   name="random">   
  <xsl:with-param   name="nodes"   select="//row"/>   
  </xsl:call-template>   
  </xsl:template>   
  <xsl:template   name="random">   
  <xsl:param   name="i">0</xsl:param>   
  <xsl:param   name="nodes"></xsl:param>   
  <xsl:variable   name="pos"   select="ssm1226:Random()"/>   
  <xsl:if   test="$i   &lt;   5">   
  <xsl:value-of   select="$nodes[$pos]"/><br/>   
  <xsl:call-template   name="random">   
  <xsl:with-param   name="i"   select="number($i)+1"/>   
  <xsl:with-param   name="nodes"   select="$nodes"/>   
  </xsl:call-template>   
  </xsl:if>   
  </xsl:template>   
  </xsl:stylesheet>

看来要学习的还是很多啊~,继续努力ing


--  作者:jacky_zh
--  发布时间:7/11/2007 11:13:00 AM

--  
说明一下,这个是随机取5个<xsl:if   test="$i   &lt;   5">,取几个就用几代替5就可以,还有,var   i=Math.ceil(Math.random()   *   10);  中的10是<row>节点总数。

--  作者:火鸟
--  发布时间:7/11/2007 12:36:00 PM

--  
这个解决方案绑定在msxml上了。
--  作者:hexun831012
--  发布时间:7/11/2007 6:29:00 PM

--  
msxsl没有兼容性,性能也很差,不建议使用
--  作者:Qr
--  发布时间:7/12/2007 8:26:00 AM

--  
这样写除非你的系统只在IE上跑。
--  作者:belinda_pjm
--  发布时间:4/17/2008 5:15:00 PM

--  
变量能这样赋值吗?<xsl:value-of   select="$nodes[$pos]"/>
--  作者:hexun831012
--  发布时间:4/17/2008 6:19:00 PM

--  
不能
--  作者:belinda_pjm
--  发布时间:4/18/2008 9:10:00 AM

--  
那上面这句话是什么意思呢?<xsl:value-of   select="$nodes[$pos]"/>
--  作者:Qr
--  发布时间:4/18/2008 11:25:00 AM

--  
以下是引用hexun831012在2007-7-10 16:58:00的发言:
impossible


--  作者:belinda_pjm
--  发布时间:4/18/2008 2:27:00 PM

--  
那三楼上面的代码就有这样的一句代码类!还有你能把变量赋值的问题 给我一个小的例题吗?
--  作者:hexun831012
--  发布时间:4/18/2008 6:35:00 PM

--  
param一但声明,只能取,不能改
还有param不时传统意义上的变量,它可以使具体的值,也可以是XPath表达式
再还有,XSL是声明式语言,请不要用赋值式语言去理解它


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