2017-10-10 62 views
0

我遇到以下問題(經常在此域上討論,但仍無法獲得確切的解決方案): 我有一個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:for-每個選擇= 「// BS09001 /細節[1]」>'拿到第一條目的詳細信息,並刪除了'XSL:if' –

回答

0

我覺得我得到你以後,快速搜索偶然發現這個蘇答案(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,讓我試試今天你的建議和「驗證「你的答案! –