现在我遇到一个小问题,大家帮忙看看这个怎么做?
待转换的xml:
<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 
<a>
  <b>
     <name>测试</name>
     <perlist>
          < per code='00123123'>
             <index>1</index>
             <group>1</group>
             <name>张三</name>
          </per>
          < per code='002345345'>
             <index>2</index>
             <group>1</group>
             <name>李四</name>
          </per>
          < per code='23434523'>
             <index>1</index>
             <group>2</group>
             <name>王五</name>
          </per>
          < per code='2343455663'>
             <index>2</index>
             <group>2</group>
             <name>赵六</name>
          </per>
     </perlist>
  <b>
</a>
当然这是我写的一个简化的列子,我想转换成这样的xml格式:
<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 
<a>
  <b>
     <name>测试</name>
     <perlist group=1>
          < per code='00123123'>
             <index>1</index>
             <group>1</group>
             <name>张三</name>
          </per>
          < per code='002345345'>
             <index>2</index>
             <group>1</group>
             <name>李四</name>
          </per>
       </perlist>
       <perlist group=2>
          < per code='23434523'>
             <index>1</index>
             <group>2</group>
             <name>王五</name>
          </per>
          < per code='2343455663'>
             <index>2</index>
             <group>2</group>
             <name>赵六</name>
          </per>
      </perlist>
  <b>
</a>
如上,我现在的没想出来,怎么用xslt来判断上面同一级节点的per怎么分成两个,怎么用foreach循环来生成下面这样的?xslt怎么写?

解决方案 »

  1.   

    用 position函数就可以解决了.<xsl:for-each select="//per[position() % 2 = 1]">
      ...
      <xsl:call-template name="xxx">
       <xsl:with-param name="pid" select="position()"/>
      </xsl:call-template>
      ...
    </xsl:for-each><xsl:template name="xxx">
      <!--接收为pid的param,并选取对应数据输出-->
    </xsl:template>或者用apply template也可以.另外如果要输出为xml的话,在xsl:output 里声明method="xml"
      

  2.   

    <xsl:for-each select="//per[position() % 2 = 1]">
    楼上解释一下
    这句能知道循环几次吗?
    我知道<xsl:for-each select="//q/w/count">
    这样返回一个数字,能知道循环几次。在per[]这样是什么意思?返回的是哪个位置?我这儿的per个数不定,分属那组完全用group来决定的。我现在就是想根据这个组来把各个节点分类?有没有戏这样做?
      

  3.   

    ="//per[position()   %   2   =   1]"> 要得到循环多少次的话:<xsl:value-of select="count(//per[position()%2=1]" />
    就可以了。//per是xpath表达式,指的文档中所有节点名为 per的节点
    那么 在for-each里select=//per,就得到了所有 per的节点,即节点集。//per[position()%2=1]
    是xquery表达式。 
    position()函数,得到某个节点在节点集里的位置,值从1开始累计。 它的名字很好的说明了它的作用。
    [这里对属性值或是函数处理进行过滤]
    position % 2 即位置对 2取余, 如果结果为1 就选取。 就是这个过滤条件。
    实际上取的是 //per节点集里,位置为1,3,5,7,...,2n+1(n>=0) 这样的节点,也奇数行节点
      

  4.   

    喔。谢谢楼上兄台
    明白啦。不过这个还不能满足我的需求。还是谢谢
    我这个过滤条件是中间的那个group值。group一样的归为一类