使用XSLT

时间:2015-10-21 14:52:48

标签: xslt duplicates counting

我在使用非常基本的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>

我会非常感激任何帮助。

1 个答案:

答案 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>