此节点的XSL计数与具有相同名称的节点(动态)

时间:2012-01-25 16:19:01

标签: xslt count nodename

我有以下XML:

<record>
  <fruit>Apples</fruit>
  <fruit>Oranges</fruit>
  <fruit>Bananas</fruit>
  <fruit>Plums</fruit>
  <vegetable>Carrots</vegetable>
  <vegetable>Peas</vegetable>
  <candy>Snickers</candy>
</record>

以及以下XSL:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" version="4.0" encoding="iso-8859-1"  indent="yes" />
<xsl:key name="nodes-by-name" match="*" use="name()"/>
<xsl:template match="*">
  <table class="fieldGrid" border="0">
    <xsl:for-each select="*">
      <xsl:if test="not(*)">
        <xsl:if test=".!=''''">
          <xsl:call-template name="lowestLevel"/>
        </xsl:if>
        <xsl:if test=".=''''">
          <xsl:call-template name="hasChildren"/>
        </xsl:if>
      </xsl:if>
      <xsl:if test="*">
        <xsl:call-template name="hasChildren"/>
      </xsl:if>
    </xsl:for-each>
  </table>
</xsl:template>

<xsl:template name="lowestLevel">
  <tr class="fields">
    <td class="fieldName">
      <xsl:value-of select="translate(local-name(), ''_'', '' '')" />
    </td>
    <td class="fieldValue">
      <xsl:value-of select="translate(., ''_'', '' '')" />
    </td>
  </tr>
</xsl:template>

  <xsl:template name="hasChildren">
    <tr>
      <td colspan="2" class="sectionTitle">
        <xsl:value-of select="translate(local-name(), ''_'', '' '')" />&#160;<xsl:value-of select="count(key(''nodes-by-name'', name()))" />
      </td>
    </tr>
    <tr>
      <td>
        <xsl:for-each select="*">
          <xsl:if test="not(*)">
             <xsl:call-template name="lowestLevel"/>
           </xsl:if>
           <xsl:if test="*">
            <xsl:call-template name="hasChildren"/>
          </xsl:if>
        </xsl:for-each>
      </td>
    </tr>
  </xsl:template>
</xsl:stylesheet>

我遇到的问题是我得到以下输出,其中数字是具有相同名称的节点的总和,而不是该节点的出现与具有相同名称的其他节点的出现。 (我已经简化了html以删除类):

<table class="fieldGrid" border="0">
  <tr>
    <td>fruit 4</td>
    <td>Apples</td>
  </tr>
  <tr>
    <td>fruit 4</td>
    <td>Oranges</td>
  </tr>
  <tr>
    <td>fruit 4</td>
    <td>Bananas</td>
  </tr>
  <tr>
    <td>fruit 4</td>
    <td>Plums</td>
  </tr>
  <tr>
    <td>vegetable 2</td>
    <td>Carrots</td>
  </tr>
  <tr>
    <td>vegetable 2</td>
    <td>Peas</td>
  </tr>
  <tr>
    <td>candy 1</td>
    <td>Snickers</td>
  <tr>
</table>

我似乎无法弄清楚如何让正确的选择器将数字设置为字段的出现次数。它需要是动态的,因为记录字段中的节点数可以超过100,我不想为所有可能的记录手动设置它。我想要的结果如下:

<table class="fieldGrid" border="0">
  <tr>
    <td>fruit 1</td>
    <td>Apples</td>
  </tr>
  <tr>
    <td>fruit 2</td>
    <td>Oranges</td>
  </tr>
  <tr>
    <td>fruit 3</td>
    <td>Bananas</td>
  </tr>
  <tr>
    <td>fruit 4</td>
    <td>Plums</td>
  </tr>
  <tr>
    <td>vegetable 1</td>
    <td>Carrots</td>
  </tr>
  <tr>
    <td>vegetable 2</td>
    <td>Peas</td>
  </tr>
  <tr>
    <td>candy 1</td>
    <td>Snickers</td>
  <tr>
</table>

谢谢

2 个答案:

答案 0 :(得分:1)

输入:

<record>
    <fruit>Apples</fruit>
    <fruit>Oranges</fruit>
    <fruit>Bananas</fruit>
    <fruit>Plums</fruit>
    <vegetable>Carrots</vegetable>
    <vegetable>Peas</vegetable>
    <candy>Snickers</candy>
</record>

XSLT:

<xsl:template match='record'>
    <table class='fieldGrid' border='0'>
        <xsl:for-each select='*'>
            <tr>
                <td>
                    <xsl:value-of select='local-name()'/>
                    <xsl:text> </xsl:text>
                    <xsl:number/>
                </td>
                <td><xsl:value-of select='.'/></td>
            </tr>
        </xsl:for-each>
    </table>
</xsl:template>

输出:

<table border="0" class="fieldGrid">
    <tr>
        <td>fruit 1</td>
        <td>Apples</td>
    </tr>
    <tr>
        <td>fruit 2</td>
        <td>Oranges</td>
    </tr>
    <tr>
        <td>fruit 3</td>
        <td>Bananas</td>
    </tr>
    <tr>
        <td>fruit 4</td>
        <td>Plums</td>
    </tr>
    <tr>
        <td>vegetable 1</td>
        <td>Carrots</td>
    </tr>
    <tr>
        <td>vegetable 2</td>
        <td>Peas</td>
    </tr>
    <tr>
        <td>candy 1</td>
        <td>Snickers</td>
    </tr>
</table>

答案 1 :(得分:0)

你必须使用

<xsl:value-of select="position()"/>