加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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() &lt;= 3]/@name"/>
   </tr>
</xsl:template>

<xsl:template match="@name">
   <td><xsl:value-of select="."/></td>
</xsl:template>

您可以通过将列放入变量来参数化列数,就像Dimitre在他的示例中所做的那样.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读