XSLT - 如何循环XML重复/重复节点并获得第一次发生

问题描述:

我遇到以下问题(经常在此域上讨论,但仍无法获得确切的解决方案): 我有一个XML像下面:XSLT - 如何循环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只选择第一循环重复值,并在情况下,可能走了过来多反复循环具有迭代次数控制。使用Muenchian分组的做什么(我相信)你想 希望我是清楚的:-(

+0

使用''拿到第一条目的详细信息,并删除了'XSL:if' –

我觉得我得到你以后,快速搜索偶然发现这个苏答案(https://stackoverflow.com/a/15693824)。适合你的目的它看起来是这样的:

<?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文档的一些假设条件下,利益在这里是没有必要做一个for循环的<BS0900_summary_block>每个孩子(这里假设在于<BS0900_summary_block>始终存在)。

+0

许多THKS,让我试试今天你的建议和“验证“你的答案! –