+ -
当前位置:首页 → 问答吧 → 急:求教xsl分栏,在线等

急:求教xsl分栏,在线等

时间:2010-09-11

来源:互联网

xsl如下:
<xsl:template match="/">
<xsl:param name="tmp">101|102|103|104|105</xsl:param>
  <xsl:param name="Nodes" as="item()*" select="test/t1/d1[contains($tmp,@type)]/s"/>
  <table style="text-align: left; width: 406px; height: 119px;" border="1" cellpadding="2" cellspacing="2">
  <tbody>
  <xsl:for-each select="$Nodes">
  <tr>
<!--如何获取$Nodes中奇数节点 -->
  <td width="50%">
  </td>
<!--如何获取$Nodes中偶数节点 -->
  <td width="50%">
  </td>
  </tr>
  </xsl:for-each>
  </tbody>
  </table>
  </xsl:template>

xml:
<?xml version="1.0" standalone="no"?>
<test xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <t1>
  <sum>0</sum>
  <d1 type="100">
  <s>9</s>
  </d1>
  <d1 type="101">
  <s>10</s>
  </d1>
  <d1 type="102">
  <s>11</s>
  </d1>
  <d1 type="103">
  <s>12</s>
  </d1>
  <d1 type="104">
  <s>13</s>
  </d1>
  <d1 type="105">
  <s>14</s>
  </d1>
  <d1 type="106">
  <s>15</s>
  </d1>
  <d1 type="107">
  <s>16</s>
  </d1>
  </t1>
</test>
期望的结果
表格分两列,第一列显示$Nodes中奇数节点中 s的值,第二列是偶数节点值

作者: fishso   发布时间: 2010-09-11

XML code

<xsl:for-each select="$Nodes">
<tr>
  <!--如何获取$Nodes中奇数节点 -->
  <td width="50%">
    <xsl:for-each select="$Nodes">
      <xsl:if test="(. mod 2 != 0)">
        <td>
          <xsl:value-of select="."/>
        </td>
      </xsl:if>
    </xsl:for-each>
  </td>
  <!--如何获取$Nodes中偶数节点 -->
  <td width="50%">
    <xsl:for-each select="$Nodes">
      <xsl:if test=". mod 2 = 0">
        <td>
          <xsl:value-of select="."/>
        </td>
      </xsl:if>
    </xsl:for-each>
  </td>
</tr>
</xsl:for-each>

作者: nwleo   发布时间: 2010-09-11

XML code

<xsl:for-each select="$Nodes">
<tr>
  <!--如何获取$Nodes中奇数节点 -->
  <td width="50%">
    <xsl:for-each select="$Nodes">
      <xsl:if test="(. mod 2 != 0)">
        <xsl:value-of select="."/>
      </xsl:if>
    </xsl:for-each>
  </td>
  <!--如何获取$Nodes中偶数节点 -->
  <td width="50%">
    <xsl:for-each select="$Nodes">
      <xsl:if test=". mod 2 = 0">
        <xsl:value-of select="."/>
      </xsl:if>
    </xsl:for-each>
  </td>
</tr>
</xsl:for-each>

作者: nwleo   发布时间: 2010-09-11

不好意思,这个才是
XML code

<xsl:for-each select="$Nodes">
<tr>
  <!--如何获取$Nodes中奇数节点 -->
  <td width="50%">
    <xsl:if test="(. mod 2 != 0)">
      <xsl:value-of select="."/>
    </xsl:if>
  </td>
  <!--如何获取$Nodes中偶数节点 -->
  <td width="50%">
    <xsl:if test=". mod 2 = 0">
      <xsl:value-of select="."/>
    </xsl:if>
  </td>
</tr>
</xsl:for-each>

作者: nwleo   发布时间: 2010-09-11

<table xmlns:fo="http://www.w3.org/1999/XSL/Format" cellspacing="2" cellpadding="2" border="1" style="text-align: left; width: 406px; height: 119px;">
<tbody>
<tr>
<td width="50%"></td><td width="50%">10</td>
</tr>
<tr>
<td width="50%">11</td><td width="50%"></td>
</tr>
<tr>
<td width="50%"></td><td width="50%">12</td>
</tr>
<tr>
<td width="50%">13</td><td width="50%"></td>
</tr>
<tr>
<td width="50%"></td><td width="50%">14</td>
</tr>
</tbody>
</table>
排版不对的

作者: fishso   发布时间: 2010-09-11

按你的布局就只能这样出来了,如果要紧凑的排版,直接用xsl写比较麻烦,不过可以用变通的做法,把全为奇数的在第一行输出,全为偶数的再第二行输出:
XML code

<xsl:for-each select="$Nodes">
<tr>
  <xsl:if test=". mod 2 != 0">
    <td>
      <xsl:value-of select="."/>
    </td>
  </xsl:if>
</tr>

<xsl:for-each select="$Nodes">
<tr>
  <xsl:if test=". mod 2 = 0">
    <td>
      <xsl:value-of select="."/>
    </td>
  </xsl:if>
</tr>
</xsl:for-each>



然后再用javascript把表格的行列转置就可以了。

作者: nwleo   发布时间: 2010-09-11

又打错了

XML code

<tr>
  <xsl:for-each select="$Nodes">
    <xsl:if test=". mod 2 != 0">
      <td>
        <xsl:value-of select="."/>
      </td>
    </xsl:if>
  </xsl:for-each>
</tr>

<tr>
  <xsl:for-each select="$Nodes">
    <xsl:if test=". mod 2 = 0">
      <td>
        <xsl:value-of select="."/>
      </td>
    </xsl:if>
  </xsl:for-each>
</tr>

作者: nwleo   发布时间: 2010-09-11

自己搞定了,不过还是谢谢楼上的,另外发现 <xsl:if test="position() mod 2=$Type">里
position() 换成点之后,排版不一样,不太明白原因
XML code

<xsl:template match="/">
        <table style="text-align: left; width: 406px; height: 119px;" border="1" cellpadding="2" cellspacing="2">
            <tbody>
            <tr>
                <td width="50%" style="vertical-align: top;">
                    <!-- 左分栏 -->
                    <xsl:call-template name="Split">
                    <xsl:with-param name="Type" select="1"/>
                    </xsl:call-template>
                    </td>
                    <td width="50%" style="vertical-align: top;">
                    <!-- 右分栏 -->
                    <xsl:call-template name="Split">
                    <xsl:with-param name="Type" select="0"/>
                    </xsl:call-template>
                </td>
            </tr>
            </tbody>
        </table>
    </xsl:template>
    
    <xsl:template name="Split">
    <xsl:param name="Type"/>
        <xsl:param name="tmp">101|102|103|104|105</xsl:param>
        <xsl:param name="Nodes" as="item()*" select="test/t1/d1[contains($tmp,@type)]/s"/>
        <table>
        <xsl:for-each select="$Nodes">
            <tr>
            <td>
            <xsl:if test="position() mod 2=$Type">
            <xsl:value-of select="."/>
            </xsl:if>
            </td>
            </tr>
        </xsl:for-each>
        </table>
    </xsl:template>


作者: fishso   发布时间: 2010-09-11

应该用点而不是用position()吧,点表示<s>里面的值</s>,而position()是代表for-each循环里面当前第n次循环。

作者: nwleo   发布时间: 2010-09-11

要是按你新的这种table嵌套table的布局,也可以这样写
XML code

<?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" indent="yes"/>

    <xsl:template match="/">
        <xsl:param name="tmp">101|102|103|104|105</xsl:param>
        <xsl:param name="Nodes" select="test/t1/d1[contains($tmp,@type)]/s"/>
        <table style="text-align: left; width: 406px; height: 119px;" border="1" cellpadding="2" cellspacing="2">
            <tbody>
                <tr>
                    <td width="50%">
                        <table>
                        <xsl:for-each select="$Nodes">
                            <xsl:if test=". mod 2 != 0">
                                <tr>
                                    <td>
                                        <xsl:value-of select="."/>
                                    </td>
                                </tr>
                            </xsl:if>
                        </xsl:for-each>
                        </table>
                    </td>
                        
                    <td width="50%">
                        <table>
                            <xsl:for-each select="$Nodes">
                                <xsl:if test=". mod 2 = 0">
                                    <tr>
                                        <td>
                                            <xsl:value-of select="."/>
                                        </td>
                                    </tr>
                                </xsl:if>
                            </xsl:for-each>
                        </table>
                    </td>
                </tr>
            </tbody>
        </table>

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

作者: nwleo   发布时间: 2010-09-11

讨论XML的相对少些. 有时间我也看看相关知识,以前看的都忘光了.

作者: theforever   发布时间: 2010-09-11