【问题标题】:Generating multiple dynamic rows of html table using XSLT使用 XSLT 生成 html 表的多个动态行
【发布时间】:2011-05-23 16:33:52
【问题描述】:

我想根据 XML 中的内容在表中动态创建行。在下面的代码中,我试图创建一个包含 5 列的行(<tr>)。填满5列后,我想新建一行。

根据以下代码,一行只能包含 5 列。如果我在 XML 上应用 XSL,则会显示错误

XSLT 编译错误。第 574 行的“tr”开始标记与“xsl:when”的结束标记不匹配。第 578 行,位置 7。

570:<table>
571:    <xsl:for-each select="/alert/account_links/account_links_info">
572:                <xsl:choose>
573:                <xsl:when test="position() mod 5 = 1">
574:                    <tr>
575:                        <td>
576:                            <xsl:value-of select="account_id"/>
577:                        </td>                           
578:                </xsl:when>
579:                <xsl:when test="position() mod 5 = 0">
580:                    <td>
581:                        <xsl:value-of select="account_id"/>
582:                    </td>
583:                    </tr>
584:                </xsl:when>
585:                <xsl:otherwise>
586:                    <td>
587:                        <xsl:value-of select="account_id"/>
588:                    </td>
589:                </xsl:otherwise>
590:                </xsl:choose>
591:                </xsl:for-each>         
592:            </table>

输入 Xml:

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<alert>
  <account_links>
    <account_links_info>
      <account_id>1</account_id>
    </account_links_info>
    <account_links_info>
      <account_id>2</account_id>
    </account_links_info>
    <account_links_info>
      <account_id>3</account_id>
    </account_links_info>
    <account_links_info>
      <account_id>4</account_id>
    </account_links_info>
    <account_links_info>
      <account_id>5</account_id>
    </account_links_info>
  </account_links>
</alert>

有人可以帮我解决这个问题吗?

【问题讨论】:

  • 您的“XML”格式不正确:它在第 577 行结束 td 之后缺少一个结束 tr 元素,并且在第 580 行开始 td 之前缺少一个开始 tr 元素。即便如此,生成的结构不是有效的 XHTML 表。如果您发布了您想要实现的目标的示例(最好是您输入的示例),这将有所帮助。
  • 如果没有您的输入和所需输出的样本,没有人可以帮助您。
  • 12345
  • 我想知道如何编写 XSL 代码以在 html 表中的上述 xml 中显示帐户 ID,其中每行包含 5 列....
  • 请编辑您的帖子以包含输入 XML,不要将其添加为评论。顺便说一句,评论中的 XML 格式不正确。

标签: xml xslt


【解决方案1】:

试试这个解决方案:

<table>
       <xsl:for-each select="/alert/account_links/account_links_info[position()mod5=1]">
        <xsl:variable name = "current-pos" select="(position()-1) * 5+1"/>
        <tr>
        <xsl:for-each select="../account_links_info[position()&gt;=$current-pos and position() &lt; $current-pos+5]" >
            <td>
                <xsl:value-of select="account_id"/>
            </td>
        </xsl:for-each>
        </tr>           
       </xsl:for-each>         
</table>

(想法是有一个&lt;tr&gt; 输出的外循环运行到每五个account_links_info element,以及一个用account_id 值填充行的内循环)。

【讨论】:

    【解决方案2】:

    XSLT 指令在结果树上生成节点,而不是词法开始和结束标记。输出一个节点是一个单一的操作,你不能把它分成两个操作,每个操作写半个节点。所以你的想法应该是“对于输入中的每五个节点我想在输出中产生一个节点”,这自然会导致诸如

    <xsl:for-each select="*[position() mod 5 = 1]">
    

    不要被诱使为此使用禁用输出转义。是毒药。它打破了转换引擎和序列化引擎之间的清晰架构边界,这意味着您的样式表无法在任意管道中干净地部署和重用(这就是它在 Firefox 中不起作用的原因,如果您有兴趣在实际后果中)。

    【讨论】:

      【解决方案3】:

      因为您将&lt;tr&gt;&lt;/tr&gt; 标记设置在不同的位置,所以您必须将它们作为文本输出,以使其对XSL 文件保持有效的XML。另外,当&lt;/tr&gt;标签是表中的最后一个元素或者最后一行可能没有关闭时,你应该输出它:

      <table>
        <xsl:for-each select="/alert/account_links/account_links_info">
          <xsl:if test="position()mod5=1">
            <xsl:text disable-output-escaping="yes">&lt;tr&gt;</xsl:text>          
          </xsl:if>
          <td>
            <xsl:value-of select="account_id"/>
          </td>
          <xsl:if test="position()mod5=0 or position()=last()">
            <xsl:text disable-output-escaping="yes">&lt;/tr&gt;</xsl:text>
          </xsl:if>        
        </xsl:for-each>
      </table>
      

      【讨论】:

      • 这不是其中之一。太可怕了。
      • @Michael Kay:认为你是对的;希望我的解决方案能更好地满足您的期望。
      • @Michael Kay:根据您在解决方案中的评论,Firefox 中的哪一部分不起作用?转换的输出难道不是下一步被解释为 XML 的文本文件吗?此外,您将来有机会为此目的包含新的 XSL 标记:, :)喜欢您的 XSLT 2.0 书。抱歉,我被黑暗的一面所吸引;)
      • @Michael Kay: 别介意第一个问题,我看到 Firefox 跳过了中间文本步骤并直接进入 DOM,因此无法正确处理。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-24
      • 1970-01-01
      • 1970-01-01
      • 2011-03-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多