Счетчик XSL этого узла сравнивает узлы с одинаковыми именами (динамически) - PullRequest
0 голосов
/ 25 января 2012

У меня есть следующий 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 ]

1 голос
/ 25 января 2012

Вход:

<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 голосов
/ 25 января 2012

вы должны использовать

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