【发布时间】:2015-10-21 14:52:48
【问题描述】:
我在完成一项非常基本的 XSLT 任务时遇到了麻烦,非常感谢任何同情我并提供帮助的人。
我需要将特定节点的每个实例的值整理到一个表中,并且
我的源 XML 看起来像这样:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="graball3.xsl"?>
<collection>
<letter id="1">
<textString>Lorem
<textString>ipsum</textString>
<textString>dolor sit</textString>
<textString>amet</textString>
consectetur adipiscing.
</textString>
</letter>
<letter id="2">
<textString>Et amo
<textString>ipsum</textString>
<textString>amet</textString>
dolor sit.
</textString>
</letter>
</collection>
我想输出一个表,该表给出节点的每个实例的值,包括嵌套的实例。在两个节点的值相同的情况下,我希望有一个条目旁边有一个计数而不是两行。
所以输出会告诉我以下内容:
<table>
<tr><td>Lorem ipsum dolor sit amet consectetur adipiscing.</td><td>[1]</td></tr>
<tr><td>ispum </td><td>[2]</td></tr>
<tr><td>dolor sit </td><td>[1]</td></tr>
<tr><td>amet</td><td>[2]</td></tr>
<tr><td>Et amo ipsum dolor sit. </td><td>[1]</td></tr>
</table>
我试图弄清楚如何阅读有关 Muenchain 方法的内容。我认为这个线程可能是它:
XSLT Ignore duplicate elements
但这只是为我输出节点的第一个实例(尽管计数准确。)
这是我目前的代码,从那里复制的。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:output method="xml" indent="yes" />
<xsl:key name="kString" match="letter" use="//textString"/>
<xsl:template match="@* | node()">
<xsl:apply-templates select="@* | node()"/>
</xsl:template>
<xsl:template match="main">
<table>
<tr>
<th>Content</th>
<th>Count</th>
</tr>
<xsl:apply-templates select="collection"/>
</table>
</xsl:template>
<xsl:template match="collection">
<xsl:apply-templates select="letter[generate-id() = generate-id(key('kString', //textString)[1])]" mode="group"/>
</xsl:template>
<xsl:template match="letter" mode="group">
<xsl:for-each select=".">
<tr>
<td>
<xsl:value-of select="//textString"/>
</td>
<td>
<xsl:value-of select="count(key('kString', //textString))"/>
</td>
</tr>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
如果有任何帮助,我将不胜感激。
【问题讨论】:
-
你引用了
letter,你应该引用textString。
标签: xslt duplicates counting