我在使用非常基本的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>
我会非常感激任何帮助。
答案 0 :(得分:0)
以这种方式尝试:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="kString" match="textString" use="."/>
<xsl:template match="/collection">
<table border="1">
<tr>
<th>Content</th>
<th>Count</th>
</tr>
<xsl:for-each select="letter//textString[generate-id()=generate-id(key('kString', .)[1])]">
<tr>
<td>
<xsl:value-of select="."/>
</td>
<td>
<xsl:value-of select="count(key('kString', .))"/>
</td>
</tr>
</xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>