首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >XSLT -如何在XML重复/重复节点上循环并获得第一次出现

XSLT -如何在XML重复/重复节点上循环并获得第一次出现
EN

Stack Overflow用户
提问于 2017-10-10 17:16:38
回答 1查看 613关注 0票数 0

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

代码语言:javascript
运行
复制
<?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尝试是:

代码语言:javascript
运行
复制
<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表只显示第一次出现的值,即:

代码语言:javascript
运行
复制
<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只选择第一个重复循环值,如果有可能超过多个重复循环,控制迭代次数。希望我说得很清楚:-

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-10 18:06:49

我想我明白你想要什么了。快速搜索就会找到这样的答案(https://stackoverflow.com/a/15693824),它使用Muenchian分组来做你想做的事情(我相信)。为了您的目的,它看起来如下所示:

代码语言:javascript
运行
复制
<?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>总是存在的)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46672370

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档