如何在xslt中使用xsl:for-each从xml文件中迭代获取值,并在表格中显示它
例如:xml文件就像
<order> <item name ="a"/> <item name ="b"/> <item name ="c"/> <item name ="d"/> <item name ="e"/> <item name ="f"/> <item name ="g"/> </order>
输出应该是
a b c d e f g
循环应该计算项目,如果它可以除以4
我正在使用以下xslt
但我不能以表格格式显示它
<xsl:template match="/"> <html> <body> <xsl:call-template name ="incr"> <xsl:with-param name ="value">1</xsl:with-param> <xsl:with-param name ="limit"> <xsl:value-of select ="count(//item)"/> </xsl:with-param> </xsl:call-template> </body> </html> </xsl:template > <xsl:template name="incr"> <xsl:param name="value"/> <xsl:param name ="limit"/> <xsl:if test ="$value!=$limit+1"> <xsl:value-of select ="//item[$value]/@name"/> <xsl:if test ="$value mod 4 =0"> <br/> <br/> </xsl:if> <xsl:call-template name ="incr"> <xsl:with-param name ="value" select ="$value+1"/> <xsl:with-param name ="limit" select ="$limit"/> </xsl:call-template> </xsl:if> </xsl:template>
请帮我这样做
提前致谢
在XSLT中考虑任何复杂问题的方法不是“如果将X作为输入,我将如何编写一个程序来生成Y?”但是,“给定输出Y,我将改变生产它的X?”掌握(或清晰表达)并不是一个简单的原则,但是一旦你得到它,XSLT中的难题似乎变得微不足道.
如果输出是一系列tr元素,如下所示:
<tr> <td>a</td><td>b</td><td>c</td> </tr> <tr> <td>d</td><td>e</td><td>f</td> </tr> <tr> <td>g</td><td>h</td><td>i</td> </tr> <tr> <td>j</td><td/><td/> </tr>
实质上,有四个输出元素.所以必须有四个输入元素.
第一个问题是,哪四个?非常清楚,它将是第1,第4,第7和第10 – 也就是说,每3个元素,从第一个开始.所以你的出发点是转换这四个元素:
<xsl:apply-templates select="/order/item[position() mod 3 = 1]"/>
好的,现在我们已经选择了每个第三个元素,我们如何创建一个tr和它之后的元素呢?使用以下兄弟轴:
<xsl:template match="item"> <tr> <td><xsl:value-of select="@name"/></td> <td><xsl:value-of select="following-sibling::item[1]/@name"/></td> <td><xsl:value-of select="following-sibling::item[2]/@name"/></td> </tr> </xsl:template>
就目前而言,这很好.但是有相当多的重复代码,如果你想(比如说)将列数从3改为6,你必须修改很多.你可以通过制作另一个模板来消除重复的代码:
<xsl:template match="item"> <tr> <xsl:apply-templates select="@name | following-sibling::item[position() <= 3]/@name"/> </tr> </xsl:template> <xsl:template match="@name"> <td><xsl:value-of select="."/></td> </xsl:template>
您可以通过将列放入变量来参数化列数,就像Dimitre在他的示例中所做的那样.