html - XSLT - 如何循环遍历 XML 重复/重复节点并获得第一次出现

标签 html css for-loop xslt iteration

我有以下问题(这个领域经常讨论这个问题,但我仍然无法得到确切的解决方案): 我有一个如下所示的 XML:

<?xml version="1.0" encoding="UTF-8"?>
<S001_subs_block>
  <BS0900_summary_block>
      <BS09001>
        <details>
          <descr_en>Services Monthly Fee</descr_en>
          <Amt>10.00</Amt>
        </details>
        <details>
          <descr_en>Calls</descr_en>
          <Amt>5.00</Amt>
        </details>
        <details>
          <descr_en>*International Roaming</descr_en>
          <Amt>7.00</Amt>
        </details>
      </BS09001>
</S001_subs_block>
<S001_subs_block>
  <BS0900_summary_block>
      <BS09001>
        <details>
          <descr_en>Services Monthly Fee</descr_en>
          <Amt>8.00</Amt>
        </details>
        <details>
          <descr_en>Calls</descr_en>
          <Amt>9.00</Amt>
        </details>
        <details>
          <descr_en>*International Roaming</descr_en>
          <Amt>14.00</Amt>
        </details>
      </BS09001>
</S001_subs_block>

我需要的是仅显示第一个重复循环子值的 HTML 输出并将其放入表格中。 我的 XSLT 尝试是:

<table class="zui-table zui-table-rounded">
        <tr>
           <th>Subscriber Invoice Summary</th>
        </tr>

       <xsl:for-each select="//BS09001/details">
       <xsl:if test="position()=1">
        <tr>
          <td><xsl:value-of select="descr_en"/></td>
          <td><xsl:value-of select="Amt"/></td>
        </tr>
       </xsl:if>
       </xsl:for-each>

       <xsl:for-each select="//BS09002/details">
       <xsl:if test="position()=1">
        <tr>
          <td><xsl:value-of select="descr_en"/></td>
          <td><xsl:value-of select="Amt"/></td>
        </tr>
        </xsl:if>
       </xsl:for-each>

      </table> 

这是行不通的,我希望 HTML 表格只显示第一次出现的值,即:

<table class="zui-table zui-table-rounded">
<tr>
<th>Account Invoice Summary</th>
</tr>
<tr>
<td>Services Monthly Fee</td><td>10.00</td>
</tr>
<tr>
<td>Calls</td><td>5.00</td>
</tr>
<tr>
<td>*International Roaming</td><td>14.00</td>
</tr>
</table>

现在我不需要 HTML 代码,我需要 XSLT 来仅选择第一个重复循环值,以防在控制迭代次数的情况下遍历多个重复循环。 希望我很清楚:-(

最佳答案

我想我明白你的意思了。快速搜索找到了这个 SO 答案 ( https://stackoverflow.com/a/15693824 ),它使用 Muenchian Grouping 来做(我相信)你想做的事。根据您的目的进行调整,它看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

<xsl:key name="details" match="//BS0900_summary_block/*" use="local-name()" />

<xsl:template match="/">
    <table class="zui-table zui-table-rounded">
        <tr>
            <th>Account Invoice Summary</th>
        </tr>

        <xsl:apply-templates select="//BS0900_summary_block/*[generate-id() = generate-id(key('details', local-name())[1])]/details" />
    </table> 
</xsl:template>

<xsl:template match="details">
    <tr>
        <td><xsl:value-of select="descr_en"/></td>
        <td><xsl:value-of select="Amt"/></td>
    </tr>
</xsl:template>

虽然对您的完整 XML 文档做了一些假设,但这里的好处是无需为 <BS0900_summary_block> 的每个子项创建一个 for 循环。 (此处假设 <BS0900_summary_block> 始终存在)。

关于html - XSLT - 如何循环遍历 XML 重复/重复节点并获得第一次出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46672370/

相关文章:

C++ 跳过当前 `for` 迭代的其余部分并开始一个新的迭代。

javascript - 在 JavaScript 中选择特定的表格单元格

javascript - 在 Javascript 中为 windows.scrollby 设置动画

jquery - 将一个 `div` 无边框的分成两半,并以 `Z` 的方式为掉落的 div 提供索引

c - 如何使用平方根优化c中的循环(完美、丰富、不足)

java - 有没有一种方法可以在使用列表时不更改列表中的原始值?

javascript - jQuery UI 可拖动 - 滚动垂直和水平问题

html - 单击滚动条时,Chrome 悬停状态消失

html - 居中 div,边距 : 0 auto; not working

html - 图像最大尺寸根据 parent 的行高