我有以下问题(这个领域经常讨论这个问题,但仍然无法得到确切的解决方案):我有一个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只选择第一个重复循环值,如果有可能超过多个重复循环,控制迭代次数。希望我说得很清楚:-
发布于 2017-10-10 18:06:49
我想我明白你想要什么了。快速搜索就会找到这样的答案(https://stackoverflow.com/a/15693824),它使用Muenchian分组来做你想做的事情(我相信)。为了您的目的,它看起来如下所示:
<?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>总是存在的)。
https://stackoverflow.com/questions/46672370
复制相似问题