在XSL中,格式化输出XML数据的问题,急!!!在线等!!高手请指教!
XML:
<?xml version= "1.0 " encoding= "gb2312 "?>
<subject>
<class>
<classid> 1 </classid>
<text> 数据一 </text>
</class>
<class>
<classid> 2 </classid>
<text> 数据二 </text>
</class>
<class>
<classid> 3 </classid>
<text> 数据三 </text>
</class>
<class>
<classid> 4 </classid>
<text> 数据四 </text>
</class>
<class>
<classid> 5> </classid>
<text> 数据五 </text>
</class>
</subject>
XSL:
…… ??
-------------------------------------------
我想将XML中class节点的数据显示在表格的一行两列中,如下:
-----------------------------------
| class[1] | class[4] |
| class[2] | class[5] |
| class[3] | |
-----------------------------------
class节点的数目有可能是偶数,也有可能是奇数。如果是偶数,就平均显示,如果是奇数,就让最中间的节点数据显示在第一列的最后,第二列显示余下数据,就如上表所示。
我思考了一下,这肯定需要得到class节点的数目,奈何我是初学,这些都不懂,而且比较急需要解决这个问题,查资料一时也查不到。请各位高手帮我解决一下,写出XSL来。。。。
谢谢。。
[解决办法]
横排有现成的,竖排麻烦
http://dotnet.aspx.cc/article/yawo3qgm-xd53-4d3d-oybr-blsbx5bngaym/read.aspx
[解决办法]
<?xml version= '1.0 ' encoding= 'gb2312 '?>
<xsl:stylesheet version= "1.0 "
xmlns= "http://www.w3.org/TR/REC-html40 "
xmlns:xsl= "http://www.w3.org/1999/XSL/Transform ">
<xsl:template match= "/ ">
<table border = "1 ">
<xsl:for-each select= "//class ">
<xsl:if test= "(position() mod 2 = 1) ">
<xsl:variable name= "n " select= "position() "/>
<tr> <td> <xsl:value-of select= ". "/> </td>
<td> <xsl:value-of select= "//class[$n+1] " /> </td> </tr>
</xsl:if>
</xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>
[解决办法]
优化后:
<?xml version= '1.0 ' encoding= 'gb2312 '?>
<xsl:stylesheet version= "1.0 "
xmlns= "http://www.w3.org/TR/REC-html40 "
xmlns:xsl= "http://www.w3.org/1999/XSL/Transform ">
<xsl:template match= "/ ">
<table border = "1 ">
<xsl:apply-templates select= "//class[position() mod 2 = 1] " />
</table>
</xsl:template>
<xsl:template match= "//class[position() mod 2 = 1] ">
<xsl:variable name= "n " select= "position() "/>
<tr> <td> <xsl:value-of select= ". "/> </td>
<td> <xsl:value-of select= "//class[$n * 2 ] " /> </td> </tr>
</xsl:template>
</xsl:stylesheet>
[解决办法]
http://blog.csdn.net/yizia/archive/2007/04/01/1548321.aspx
[解决办法]
也可以参考下这篇http://blog.csdn.net/cds27/archive/2006/07/06/884721.aspx
[解决办法]
用递归方法来做:
<?xml version= '1.0 ' encoding= 'gb2312 '?>
<xsl:stylesheet version= "1.0 "
xmlns= "http://www.w3.org/TR/REC-html40 "
xmlns:xsl= "http://www.w3.org/1999/XSL/Transform ">
<xsl:template match= "/ ">
<xsl:variable name= "totalCount " select= "count(subject/class) "/>
<table border = "1 ">
<xsl:call-template name= "LOOP ">
<xsl:with-param name= "count " select= "$totalCount "/>
<xsl:with-param name= "number " select= "1 "/>
</xsl:call-template>
</table>
</xsl:template>
<xsl:template name= "LOOP ">
<xsl:param name= "count "/>
<xsl:param name= "number "/>
<tr>
<td> <xsl:value-of select= "/subject/class[$number] "/> </td>
<td> <xsl:value-of select= "/subject/class[ceiling($count div 2) + $number] "/> </td>
</tr>
<xsl:if test= "($count div 2) > $number ">
<tr>
<td>
<xsl:call-template name= "LOOP ">
<xsl:with-param name= "number " select= "$number + 1 "/>
<xsl:with-param name= "count " select= "$count "/>
</xsl:call-template>
</td>
</tr>
</xsl:if>
</xsl:template>
</xsl:stylesheet>