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分组的做什么(我相信)你想 希望我是清楚的:-(
答
我觉得我得到你以后,快速搜索偶然发现这个苏答案(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,让我试试今天你的建议和“验证“你的答案! –
使用''拿到第一条目的详细信息,并删除了'XSL:if' –