Сумма значений XSLT на основе данных в двух разных таблицах - PullRequest
0 голосов
/ 21 июля 2009

XML:

<Budget>
    <Table1>
        <AllocID>1</AllocID>
        <Amount>1000</Amount>
    </Table1>
    <Table1>
        <AllocID>2</AllocID>
        <Amount>2000</Amount>
    </Table1>
    <Table1>
        <AllocID>3</AllocID>
        <Amount>3000</Amount>
    </Table1>
    <Table2>
        <AllocID>1</AllocID>
        <Split>100</Split>
    </Table2>
    <Table2>
        <AllocID>2</AllocID>
        <Split>100</Split>
    </Table2>
</Budget>

Я отображаю суммы в таблице, но только если в Таблице 2 существует значение «Разделить».

<xsl:for-each select="Budget/Table1">
    <xsl:for-each select="//Budget/Table2[AllocID = current()/AllocID]">
        <xsl:value-of select="Amount"/>
    </xsl:for-each>
</xsl:for-each>
//Total for the records here.

Мне нужно получить сумму сумм из таблицы 1, но только если в таблице 2 существует значение для AllocID. Таким образом, в этом примере мне нужна только сумма Amount для AllocID 1 и 2. Как бы я сделал это в xslt без изменения заданных наборов данных?

1 Ответ

2 голосов
/ 21 июля 2009

Больше ничего не зная о ваших входных данных (я понятия не имею, почему вы выбрали , чтобы не использовать настоящий XML ), мне придется немного догадаться:

<Budget>
  <Table1>
    <AllocID>1000</AllocID>
    <AllocID>2000</AllocID>
    <AllocID>3000</AllocID>
  </Table1>
  <Table2>
    <AllocID>1000</AllocID>
    <AllocID>2000</AllocID>
  </Table2>
</Budget>

Самой простой является функция XPath sum() вместе с правильным выражением XPath:

<!-- this will return 3000 for the above input -->
<xsl:template match="/" >
  <xsl:value-of select="
    sum(Budget/Table1/AllocID[. = //Budget/Table2/AllocID])
  " />
</xsl:template>

Промежуточные суммы также можно рассчитать с помощью рекурсивной функции, например:

<!-- this will also return 3000 for the above input -->
<xsl:template match="/" >
  <xsl:call-template name="total">
    <xsl:with-param name="nodes" select="
      Budget/Table1/AllocID[. = //Budget/Table2/AllocID]
    " />
  </xsl:call-template>
</xsl:template>

<xsl:template name="total">
  <xsl:param name="nodes" />

  <xsl:choose>
    <!-- either there is something to calculate... -->
    <xsl:when test="string(number($nodes[1])) != 'NaN'">
      <xsl:variable name="subtotal">
        <xsl:call-template name="total">
          <xsl:with-param name="nodes" select="$nodes[position() &gt; 1]" />
        </xsl:call-template>
      </xsl:variable>
      <xsl:value-of select="number($nodes[1]) + $subtotal" /> 
    </xsl:when>
    <!-- ...or we assume 0 -->
    <xsl:otherwise>
      <xsl:value-of select="0" /> 
    </xsl:otherwise>
  </xsl:choose>

</xsl:template>

Это медленнее, но обеспечивает большую гибкость в процессе расчета. Вы можете заменить все нечисловые значения на 0, например. Или используйте разные значения данных узлов в соответствии с вашими правилами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...