xml – 如何在xslt中使用for循环
发布时间:2020-12-15 23:55:40 所属栏目:百科 来源:网络整理
导读:如何在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 循环
如何在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在他的示例中所做的那样. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |