这个节点的XSL计数经文具有相同的名称(动态)节点

这个节点的XSL计数经文具有相同的名称(动态)节点

问题描述:

我有下面的XML:这个节点的XSL计数经文具有相同的名称(动态)节点

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

谢谢

+0

'的'产生一个XML文档4.0 =>''这是不正确?。对于HTML 4.01 DTD,您必须使用'doctype-public'和'doctype-system',例如:' – Saxoier

输入:

<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> 
+0

就是这个''是我正在寻找的东西。谢谢。 – Matthew

必须使用

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

'position()'会给我整个节点的位置,不会在新节点开始时返回1名称。 – Matthew